创建一个类以在运行时实现接口(类似于代理类)

本文关键字:实现 接口 类似于 运行时 代理 一个 创建 | 更新日期: 2023-09-27 18:19:52

首先,我将Visual Studio 2005与.NET Framework 2.0一起使用。不幸的是,我不能使用VS/.NET.的最新版本

我需要能够在运行时创建一个继承另一个类并实现某个接口的类。问题是需要继承的类具有与接口相同的方法签名。

例如:

public interface ITestInterface
{
    void Test1();
    string Test2(int a, string b);
}
public class TestClass
{
    public void Test1() { ... }
    public string Test2(int a, string b) { ... }
    public void AnotherMethod() { ... }
}

如果我创建另一个类,例如:

public class AnotherClass : TestClass, ITestInterface
{
}

在VisualStudio2005中,由于TestClass已经实现了接口的所有方法/函数,因此它的编译没有任何问题。

如果我检查这个类生成的MSIL代码,我可以看到它创建了一个名为AnotherClass的类型,该类型继承自TestClass,并实现了我所期望的ITestInterface(没有实现方法/函数,因为它们已经在基类中实现了)。

尝试在运行时通过代码这样做:

object GetProxy(Type iface, Type obj)
{
    string name = obj.Name + "Proxy";
    AssemblyBuilder assyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName(name), AssemblyBuilderAccess.Run);
    ModuleBuilder modBuilder = assyBuilder.DefineDynamicModule(name);
    TypeBuilder typeBuilder = modBuilder.DefineType(name, TypeAttributes.Public | TypeAttributes.AutoClass | TypeAttributes.AnsiClass | TypeAttributes.BeforeFieldInit, obj, new Type[] { iface });
    Type proxyType = typeBuilder.CreateType(); // Exception here
    return Activator.CreateInstance(proxyType);
}

抛出以下异常:

中发生类型为"System.TypeLoadException"的未处理异常mscorlib.dll

其他信息:来自的类型"TestClassProxy"中的方法"Test1"程序集的TestClassProxy,版本=0.0.0.0,区域性=中性,PublicKeyToken=null"没有实现。"。

如果接口的方法已经在基类中实现,我不明白为什么运行时会强迫我实现它们。

你有什么想法吗?也许我错过了一个选择?

创建一个类以在运行时实现接口(类似于代理类)

根据此链接中找到的信息和Brian建议的信息,将基类方法/函数标记为虚拟解决了这个特定的问题。

我知道这对基类提出了要求,但在我的情况下这是可以接受的。