首页 > 解决方案 > C# 动态方法 - 具有“对象”返回类型的字段获取器

问题描述

我需要将该字段作为“对象”类型。

这是该方法的 IL:

gen.Emit(OpCodes.Ldarg_0);
gen.Emit(OpCodes.Ldfld, field);
gen.Emit(OpCodes.Ret);

我应该添加什么来投射到对象。

感谢在线 C# 到 IL 工具,如果字段是值类型,我必须添加

OpCodes.Box

但是如果字段不是值类型怎么办。

我应该获取字段类型并为引用类型字段和值类型字段创建两个单独的动态方法。

另一个问题 :

我怎样才能破坏动态方法并重新创建它。(生命周期?)

标签: c#cil

解决方案


您需要将值类型结果装箱,例如:

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);
}

推荐阅读