如何获得属性设置器说明?

时间:2014-02-13 02:41:14

标签: c# mono.cecil

我正在尝试获取现有属性设置器的属性定义。但是,SetMethod似乎总是为null,即使我知道它存在。

到目前为止,这是我的尝试:

public class Bar
{
    private Foo _foo;
    public virtual Foo Foo { get { return _foo; } { set { _foo = value; } }
}

var moduleDefinition = ModuleDefinition.ReadModule(assemblyFile);

var propertyTypeReference = new TypeReference(
    typeof(Foo).Namespace, 
    typeof(Foo).Name, 
    moduleDefinition, 
    null
);

var propertyDefinition = new PropertyDefinition(
    "Foo", 
    Mono.Cecil.PropertyAttributes.None, 
    propertyTypeReference
);

//always throws NullReferenceException because SetMethod is always null.
var instructions = propertyDefinition.SetMethod.Body.Instructions.ToList();

(我在Microsoft .NET CLR下运行)。

如何使用Mono.Cecil获取现有属性的setter指令?

2 个答案:

答案 0 :(得分:1)

您应该从TypeDefinition获取Foo的{​​{1}},然后从ModuleDefinition.Types获取PropertyDefinition的{​​{1}}。之后您可以获得set方法及其说明。

不要使用任何构造函数,因为它们用于构建新元数据,而不是分析现有元数据。实际上,在代码中调用它们会构建新的引用/定义,并且由于您没有正确构建它们,因此会出现异常。

答案 1 :(得分:0)

你可以试试asm.MainModule.GetType(“ClassFullname”)。Methods.First(m => m.Name ==“set_Foo”)