运行时生成类型
我需要在运行时创建带有属性的类型。 类型必须如下所示:
public class RunTimeType : BaseType
{
private string _field1;
public string Property1
{
get { return _field1; }
set
{
if (_field1 != value)
{
_field1 = value;
OnAfterPropertySet("Property1");
}
}
}
}
问题是如何创建 Set 方法?现在我使用以下代码:
var propertyName = "Property1";
var onAfterPropertySet = baseType.GetMethod("OnAfterPropertySet",
BindingFlags.Instance | BindingFlags.InvokeMethod |
BindingFlags.NonPublic, null, new[] { typeof(string) },
null);
ILGenerator currSetIL = currSetPropMthdBldr.GetILGenerator();
currSetIL.Emit(OpCodes.Ldarg_0);
currSetIL.Emit(OpCodes.Ldarg_1);
currSetIL.Emit(OpCodes.Stfld, field);
currSetIL.Emit(OpCodes.Ldstr, propertyName);
currSetIL.Emit(OpCodes.Call, onAfterPropertySet);
currSetIL.Emit(OpCodes.Pop);
currSetIL.Emit(OpCodes.Ret);
但是当我尝试为属性设置值时,会引发异常
I need to create type with properties at runtime.
Type must be look like this:
public class RunTimeType : BaseType
{
private string _field1;
public string Property1
{
get { return _field1; }
set
{
if (_field1 != value)
{
_field1 = value;
OnAfterPropertySet("Property1");
}
}
}
}
the question is how to create Set method ? Now i use folowing code :
var propertyName = "Property1";
var onAfterPropertySet = baseType.GetMethod("OnAfterPropertySet",
BindingFlags.Instance | BindingFlags.InvokeMethod |
BindingFlags.NonPublic, null, new[] { typeof(string) },
null);
ILGenerator currSetIL = currSetPropMthdBldr.GetILGenerator();
currSetIL.Emit(OpCodes.Ldarg_0);
currSetIL.Emit(OpCodes.Ldarg_1);
currSetIL.Emit(OpCodes.Stfld, field);
currSetIL.Emit(OpCodes.Ldstr, propertyName);
currSetIL.Emit(OpCodes.Call, onAfterPropertySet);
currSetIL.Emit(OpCodes.Pop);
currSetIL.Emit(OpCodes.Ret);
but when i trying to set value to the property, exception is thrown
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
你们并不是很亲近。您忘记了相等测试并将隐藏的 this 参数传递给实例方法。最好的方法是首先用 C# 编写代码:
在发布模式下构建它,然后使用 ildasm.exe 或 Reflector 查看生成的 IL:
You're not really close. You forgot the equality test and passing the hidden this argument to the instance method. The best way to do this is to write the code in C# first:
Build it in the Release mode then take a look at the generated IL with ildasm.exe or Reflector:
在为
this
参数调用onAfterPropertySet
之前,您需要Ldarg_0
。You need to
Ldarg_0
before callingonAfterPropertySet
for thethis
parameter.