大家好我试图在运行时使用动态方法和ILGenerator生成一个委托,以调用对象上的属性的Setter .......
private static GenericIntSetter CreateIntSetMethod(PropertyInfo propertyInfo)
{
MethodInfo setMethod = propertyInfo.GetSetMethod();
if (setMethod == null)
return null;
Type[] arguments = new Type[2];
arguments[0] = typeof(Person);
arguments[1] = typeof(int);
DynamicMethod setter = new DynamicMethod(
String.Concat("_Set", propertyInfo.Name, "_"),
typeof(void), arguments, propertyInfo.DeclaringType);
ILGenerator generator = setter.GetILGenerator();
generator.Emit(OpCodes.Ldarg_0);
generator.Emit(OpCodes.Castclass, propertyInfo.DeclaringType);
generator.Emit(OpCodes.Ldarg_1);
if (propertyInfo.PropertyType.IsClass)
{
generator.Emit(OpCodes.Castclass, propertyInfo.PropertyType);
}
else
{
generator.Emit(OpCodes.Unbox_Any, propertyInfo.PropertyType);
}
generator.EmitCall(OpCodes.Callvirt, setMethod, null);
generator.Emit(OpCodes.Ret);
return (GenericIntSetter)setter.CreateDelegate(typeof(GenericIntSetter));
}
当我调用此方法并调用删除时,我得到了一个损坏的内存错误,任何想法?
答案 0 :(得分:1)
是的。这样做真的很复杂,但并非不可能。
我有一个仅针对http://mirrormirror.codeplex.com
的开源项目在http://mirrormirror.codeplex.com/SourceControl/changeset/view/66562#869731中,您将找到我需要做的所有发射的代码。找到setter实现应该很容易。
希望有所帮助