C# 创建一个类以在运行时实现接口(如代理类)
首先,我使用Visual Studio 2005和.NET Framework 2.0。不幸的是,我不能使用VS/.NET的最新版本 我需要能够在运行时创建一个继承另一个类并实现某个接口的类。问题是需要继承的类具有接口的sames方法签名 例如:C# 创建一个类以在运行时实现接口(如代理类),c#,.net,proxy,runtime,cil,C#,.net,Proxy,Runtime,Cil,首先,我使用Visual Studio 2005和.NET Framework 2.0。不幸的是,我不能使用VS/.NET的最新版本 我需要能够在运行时创建一个继承另一个类并实现某个接口的类。问题是需要继承的类具有接口的sames方法签名 例如: public interface ITestInterface { void Test1(); string Test2(int a, string b); } public class TestClass { public
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
{
}
如果我创建另一个类,例如:
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建议的信息,将基类方法/函数标记为virtual解决了这个特殊问题
我知道这对基类提出了要求,但这在我的情况下是可以接受的。您的
另一个类
没有为我编译,因为TestClass
中的方法不是公共的
。当我修复这个问题时,GetProxy()
也开始工作。即使TestClass的方法/函数是公共的,它也可能重复,这对我来说不起作用。它编译为OK,但在调用CreateType()时失败,出现相同的异常。