2012-10-17 60 views
1

我想使用Mono.Cecil將自定義屬性添加到方法。自定義屬性的構造函數有一個System.Type。我想弄清楚如何用Mono.Cecil創建這樣的自定義屬性,以及System.Type參數的參數是什麼。如何添加將Type作爲參數的自定義屬性

我的屬性被定義如下:

public class SampleAttribute : Attribute { 
    public SampleAttribute (Type type) {} 
} 

到目前爲止,我已經試過:

var module = ...; 
var method = ...; 
var sampleAttributeCtor = ...; 

var attribute = new CustomAttribute (sampleAttributeCtor); 

attribute.ConstructorArguments.Add (
    new ConstructorArgument (module.TypeSystem.String, module.GetType ("TestType").FullName)); 

但它似乎並沒有工作。任何想法?

如下

var module=targetExe.MainModule; 
      var anothermodule=sampleDll.MainModule; 
      var custatt = new CustomAttribute(ctorReference); 


      var corlib =module .AssemblyResolver.Resolve((AssemblyNameReference)module.TypeSystem.Corlib); 
      var systemTypeRef = module.Import(corlib.MainModule .GetType("System.Type")); 
      custatt.ConstructorArguments.Add(new CustomAttributeArgument(systemTypeRef, module.Import(anothermodule.GetType("SampleDll.Annotation")))); 
      methodDef.CustomAttributes.Add(custatt); 

任何建議,我已經更新的代碼?

+0

我不介意回答Mono.Cecil的問題,但你應該讓他們更容易閱讀和幫助你。提供的代碼是混亂的,沒有變色,並且可以簡化爲只有幾行,我想你是怎麼想的。我要編輯這個問題給你一個例子。 –

回答

2

儘管自定義屬性中的類型使用全名作爲字符串進行編碼,但Cecil會爲您抽象。

Mono.Cecil中Type的表示形式爲TypeReference(如果類型來自同一個模塊,則表示TypeDefinition)。

您只需將其作爲參數傳遞即可。首先,您需要獲得對類型System.Type的引用,以用作自定義屬性參數的類型。

var corlib = module.AssemblyResolver.Resolve ((AssemblyNameReference) module.TypeSystem.Corlib); 
var systemTypeRef = module.Import (corlib.GetType ("System.Type")); 

然後根據您想要的類型作爲參數來使用,你可以寫:

attribute.ConstructorArguments.Add (
    new ConstructorArgument (
     systemTypeRef, 
     module.GetType ("TestType"))); 

,或者如果你有興趣類型是在另一個模塊中,你需要輸入一個參考:

attribute.ConstructorArguments.Add (
    new ConstructorArgument (
     systemTypeRef, 
     module.Import (anotherModule.GetType ("TestType")))); 
+0

嗨,我試過你的解決方案,並得到錯誤「操作無效,由於對象的當前狀態。」 –

+0

var custatt = new CustomAttribute(ctorReference); var corlib = inputmodule.AssemblyResolver.Resolve(inputmodule.TypeSystem.Corlib.Name); var systemTypeRef = inputmodule.Import(corlib.GetType()); custatt.ConstructorArguments.Add(new CustomAttributeArgument(systemTypeRef,inputmodule.Import(anothermodule .GetType(「SampleDll.Annotation」)))); methodDef.CustomAttributes.Add(custatt); –

+0

@MuruganAlagesan不,你沒有。初始化systemTypeRef的值不是我寫的。 –

相關問題