2015-10-19 89 views
0

如何修改附加到某個TypeTypeAttributes如何更改類型的屬性?

我想修改一個類型並通過應用TypeAttributes.Abstract標誌將其抽象化,我該怎麼做?我確定我需要在某個地方調用CLR,但是我無法追蹤它從哪裏得到這個信息,它似乎是一個無休止的分層方法調用其他方法的系統。

+0

要修改現有的類型是一個有趣的慾望...什麼是你如果你能分享它的最終目標? –

+3

據我所知,你不能修改現有的類型。你可以發出一個新的類型,但它可以複製現有的類型,但可能會非常複雜。你爲什麼想要這樣做呢? – poke

+0

@Alexei我需要防止某種類型在任何情況下被實例化。 – AlphaModder

回答

0

您可以使用庫(如Mono.Cecil)以編程方式更改類型。 假設您在名爲「ExistingAssembly.dll」的程序集中有名爲「Test」的類,並且希望將類「Test」變成抽象類。 你現在需要做的是:

void Main(){ 
    //This is the existing assembly containing the type that you wish to modify 
    var assemblyFile = @"C:\temp\ExistingAssembly.dll"; 

    var ass = Mono.Cecil.AssemblyDefinition.ReadAssembly(assemblyFile); 
    var type = ass.MainModule.GetTypes().First(t => t.Name == "Test"); 
    //Make the type an Abstract type (class) 
    type.IsAbstract = true; 

    //Finally save the modified assembly into a new file 
    ass.Write(@"C:\temp\ModifiedAssembly.dll"); 

    //The type "Test" in the above "ModifiedAssembly.dll" is now an abstract class. 
} 

// This is the Type that you wish to turn into an Abstract Class 
public class Test { 
    public string DummyMethod(){ 
     return "Dummy Return"; 
    } 
} 

您可以從這裏得到的Mono.Cecil能組件(的NuGet): https://www.nuget.org/packages/Mono.Cecil/