创建一个类以在运行时实现接口(类似于代理类)
本文关键字:实现 接口 类似于 运行时 代理 一个 创建 | 更新日期: 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建议的信息,将基类方法/函数标记为虚拟解决了这个特定的问题。
我知道这对基类提出了要求,但在我的情况下这是可以接受的。