【发布时间】:2015-10-29 20:19:16
【问题描述】:
首先,我使用带有 .NET Framework 2.0 的 Visual Studio 2005。不幸的是,我不能使用最新版本的 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
{
}
在 Visual Studio 2005 中,它可以毫无问题地编译,因为 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' 没有实现。
如果接口的方法已经在基类中实现,我不明白为什么运行时会强迫我实现接口的方法。
你有什么想法吗?也许我缺少一个选项?
【问题讨论】:
-
您的
AnotherClass无法为我编译,因为TestClass中的方法不是public。当我解决这个问题时,GetProxy()也开始工作了。 -
即使 TestClass 的方法/函数是公开的,它对我也不起作用。它编译正常,但在 CreateType() 调用中失败并出现相同的异常。