C# 动态方法 - 类型为 "Object" return 的字段 getter
C# dynamic method - Field getter with "Object" return type
我需要获取类型为 "object" 的字段。
这是方法的 IL:
gen.Emit(OpCodes.Ldarg_0);
gen.Emit(OpCodes.Ldfld, field);
gen.Emit(OpCodes.Ret);
我应该添加什么来投射到对象。
感谢在线 C# 到 IL 工具,如果字段是值类型我必须添加
OpCodes.Box
但是如果字段不是值类型怎么办。
我是否应该获取字段类型并为引用类型字段和值类型字段创建两个单独的动态方法。
另一个问题:
如何销毁动态方法并重新创建它。 (生命周期?)
您需要对值类型的结果进行装箱,例如:
public void EmitFieldGetter(ILGenerator gen, FieldInfo field)
{
gen.Emit(OpCodes.Ldarg_0);
gen.Emit(OpCodes.Ldfld, field);
if (field.FieldType.IsValueType)
{
gen.Emit(OpCodes.Box, field.FieldType);
}
gen.Emit(OpCodes.Ret);
}
我需要获取类型为 "object" 的字段。
这是方法的 IL:
gen.Emit(OpCodes.Ldarg_0);
gen.Emit(OpCodes.Ldfld, field);
gen.Emit(OpCodes.Ret);
我应该添加什么来投射到对象。
感谢在线 C# 到 IL 工具,如果字段是值类型我必须添加
OpCodes.Box
但是如果字段不是值类型怎么办。
我是否应该获取字段类型并为引用类型字段和值类型字段创建两个单独的动态方法。
另一个问题:
如何销毁动态方法并重新创建它。 (生命周期?)
您需要对值类型的结果进行装箱,例如:
public void EmitFieldGetter(ILGenerator gen, FieldInfo field)
{
gen.Emit(OpCodes.Ldarg_0);
gen.Emit(OpCodes.Ldfld, field);
if (field.FieldType.IsValueType)
{
gen.Emit(OpCodes.Box, field.FieldType);
}
gen.Emit(OpCodes.Ret);
}