gpt4 book ai didi

.net - 在实现接口(interface)但使用基类的成员实现的 .NET 中创建 DynamicType

转载 作者:行者123 更新时间:2023-12-04 00:26:58 28 4
gpt4 key购买 nike

我正在尝试生成一个实现接口(interface)的动态类,但是其中一个或多个成员已经存在于基础中。我在 C# 中编译了以下代码,并在反射器中检查它以查看 C# 编译器的作用。

class BaseClass
{
public string Bob
{
get { return "Bob"; }
}
}

interface IStuff
{
string Bob { get; }
}

class SubClass : BaseClass, IStuff
{
}

Reflector 在 SubClass 中没有显示任何实现。
.class private auto ansi beforefieldinit SubClass
extends Enterprise.Services.OperationalActions.Business.Filters.BaseClass
implements Enterprise.Services.OperationalActions.Business.Filters.IStuff
{
}

但是如果我没有明确地发出成员, TypeBuilder.CreateType()抛出 InvalidOperationException声明该成员没有实现。所以我的问题是,我该如何告诉 TypeBuilder接口(interface)成员应该从基础中获取它的实现吗?

最佳答案

看起来像 TypeBuilder您将不得不添加一个私有(private)直通,只是为了让它开心(下)。您也可以尝试使用 IKVM builder - 几乎相同的 API,但它可能没有这个限制。

using System;
using System.Reflection;
using System.Reflection.Emit;
public class BaseClass
{
public string Bob
{
get { return "Bob"; }
}
}

public interface IStuff
{
string Bob { get; }
}
static class Program
{
static void Main()
{
var name = new AssemblyName("foo");
var asm = AppDomain.CurrentDomain.DefineDynamicAssembly(name, AssemblyBuilderAccess.Run);
var mod = asm.DefineDynamicModule("foo");
var parent = typeof(BaseClass);
var type = mod.DefineType("SubClass", parent.Attributes, parent);
type.AddInterfaceImplementation(typeof(IStuff));

var bob_get = type.DefineMethod("bob_get", MethodAttributes.Virtual | MethodAttributes.Private,
typeof(string), Type.EmptyTypes);
var il = bob_get.GetILGenerator();
il.Emit(OpCodes.Ldarg_0);
il.EmitCall(OpCodes.Callvirt, parent.GetProperty("Bob").GetGetMethod(), null);
il.Emit(OpCodes.Ret);
type.DefineMethodOverride(bob_get, typeof(IStuff).GetProperty("Bob").GetGetMethod());
var final = type.CreateType();
IStuff obj = (IStuff) Activator.CreateInstance(final);
Console.WriteLine(obj.Bob);
}
}

关于.net - 在实现接口(interface)但使用基类的成员实现的 .NET 中创建 DynamicType,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4801537/

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