我想使用Mono.Cecil为方法添加自定义属性。自定义属性的构造函数具有System.Type
。我试图弄清楚如何使用Mono.Cecil创建这样的自定义属性以及System.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 :(得分: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"))));