Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 系统反射IL发射覆盖方法语法_C#_System.reflection - Fatal编程技术网

C# 系统反射IL发射覆盖方法语法

C# 系统反射IL发射覆盖方法语法,c#,system.reflection,C#,System.reflection,我想在下面生成的代码中正确重写ToString()。My ToString应该返回_value字段的内容 我很难找到正确覆盖它的语法-以下是我当前的代码: static public Type BuildType() { AppDomain domain = Thread.GetDomain(); AssemblyName assemblyName = new AssemblyName {Name = "DynamicDataGridDataAsm"}; Assembly

我想在下面生成的代码中正确重写ToString()。My ToString应该返回_value字段的内容

我很难找到正确覆盖它的语法-以下是我当前的代码:

static public Type BuildType() {
    AppDomain domain = Thread.GetDomain();
    AssemblyName assemblyName = new AssemblyName {Name = "DynamicDataGridDataAsm"};
    AssemblyBuilder assemblyBuilder = domain.DefineDynamicAssembly(assemblyName,AssemblyBuilderAccess.RunAndSave);
    ModuleBuilder dynamicDataGridDataModule = assemblyBuilder.DefineDynamicModule("DynamicDataGridDataModule", "DynamicDataGridDataModule.dll");
    TypeBuilder ivTypeBld = dynamicDataGridDataModule.DefineType("DynamicDataGridData", TypeAttributes.Public);

    FieldBuilder field = ivTypeBld.DefineField("_value", typeof(string), FieldAttributes.Public);
    MethodBuilder getValue = ivTypeBld.DefineMethod("ToString", 
        MethodAttributes.Public ,
        CallingConventions.Standard,
        typeof(string), 
        Type.EmptyTypes);

    ILGenerator il = getValue.GetILGenerator();
    il.Emit(OpCodes.Ldarg_0);
    il.Emit(OpCodes.Ldfld, field);
    il.Emit(OpCodes.Ret);

    return ivTypeBld.CreateType();
}

我目前在对象上显式调用此方法,但我假设如果我正确重写它,那么我(和框架)可以使用点运算符调用它并执行我的实现

阅读更多内容并查看其他示例后,这些参数和调用似乎正确地覆盖了object的ToString()方法:

    FieldBuilder field = ivTypeBld.DefineField("_value", typeof(string), FieldAttributes.Public);
    MethodBuilder toStringMethod = ivTypeBld.DefineMethod("ToString",
        MethodAttributes.Public
        | MethodAttributes.HideBySig
        | MethodAttributes.NewSlot
        | MethodAttributes.Virtual
        | MethodAttributes.Final,
        CallingConventions.HasThis,
        typeof(string), 
        Type.EmptyTypes);

    ILGenerator il = toStringMethod.GetILGenerator();
    il.Emit(OpCodes.Ldarg_0);
    il.Emit(OpCodes.Ldfld, field);
    il.Emit(OpCodes.Ret);

    ivTypeBld.DefineMethodOverride(toStringMethod, typeof(object).GetMethod("ToString"));
更好的信息是可用的,但为了帮助任何正在查看的人,属性规定新函数是公共的,通过名称和签名隐藏基类成员,占用新的vtable槽,是最终的,并且将在实例上调用(不是静态函数-HasThis)

我还没有研究“NewSlot”是否有必要或者为什么有必要,或者它对这个方法定义的真正意义