我正在尝试获取现有属性设置器的属性定义。但是,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指令?
答案 0 :(得分:1)
您应该从TypeDefinition
获取Foo
的{{1}},然后从ModuleDefinition.Types
获取PropertyDefinition
的{{1}}。之后您可以获得set方法及其说明。
不要使用任何构造函数,因为它们用于构建新元数据,而不是分析现有元数据。实际上,在代码中调用它们会构建新的引用/定义,并且由于您没有正确构建它们,因此会出现异常。
答案 1 :(得分:0)
你可以试试asm.MainModule.GetType(“ClassFullname”)。Methods.First(m => m.Name ==“set_Foo”)