gpt4 book ai didi

c# - .NET 创建结构属性 getter 委托(delegate)

转载 作者:太空宇宙 更新时间:2023-11-03 15:43:46 25 4
gpt4 key购买 nike

我有创建属性 getter 委托(delegate)的方法:

private static Delegate CreatePropertyGetter(PropertyInfo propertyInfo)
{
MethodInfo propertyGetter = propertyInfo.GetGetMethod();

DynamicMethod dynGetter = new DynamicMethod
(
String.Concat("DM$MEMBER_GETTER_", propertyInfo.Name),
propertyInfo.PropertyType,
new Type[1] { propertyInfo.DeclaringType },
propertyInfo.DeclaringType,
true
);

ILGenerator ilGen = dynGetter.GetILGenerator();

ilGen.Emit(OpCodes.Ldarg_0);

ilGen.EmitCall(propertyInfo.DeclaringType.IsValueType ? OpCodes.Call : OpCodes.Callvirt, propertyGetter, null);

ilGen.Emit(OpCodes.Ret);

return dynGetter.CreateDelegate(typeof(MemberGetter<,>).MakeGenericType(propertyInfo.DeclaringType, propertyInfo.PropertyType));
}

此代码适用于类,但当我尝试获取属性值时,结构会抛出 ArgumentNullException。

最佳答案

试着改变一行:

ilGen.Emit(OpCodes.Ldarg_0);

为此:

ilGen.Emit(propertyInfo.DeclaringType.IsValueType ? OpCodes.Ldarga : OpCodes.Ldarg, 0);

这会加载第一个参数的地址(位于堆栈上),这是调用结构上的实例方法所必需的。
但是,我更喜欢使用 System.Linq.Expressions 而不是 Emit。

关于c# - .NET 创建结构属性 getter 委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29176128/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com