Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 创建一个类以在运行时实现接口(如代理类)_C#_.net_Proxy_Runtime_Cil - Fatal编程技术网

C# 创建一个类以在运行时实现接口(如代理类)

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

首先,我使用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 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()时失败,出现相同的异常。