C# 在程序集中创建动态伪类

C# 在程序集中创建动态伪类,c#,.net,dynamic,reflection,.net-assembly,C#,.net,Dynamic,Reflection,.net Assembly,也许我所问的是不可能的,但这是我的问题。首先是C#和.NET 我想定义一个类的空实现(空方法,返回默认值的函数)到一个接口,如果我改变接口,我就不需要修改代码。不幸的是,我无法生成包含程序集的实现,也无法在其上定义动态模拟,因为实例化是通过反射自动完成的。下面是更广泛地解释的问题: 我有一个dll/程序集,我们称之为IMyInterface.dll,它包含一个接口:IMyInterface。 上面的层我在一个单独的dll/程序集中有实现,我们称之为MyInterfaceImplementatio

也许我所问的是不可能的,但这是我的问题。首先是C#和.NET 我想定义一个类的空实现(空方法,返回默认值的函数)到一个接口,如果我改变接口,我就不需要修改代码。不幸的是,我无法生成包含程序集的实现,也无法在其上定义动态模拟,因为实例化是通过反射自动完成的。下面是更广泛地解释的问题:

我有一个dll/程序集,我们称之为IMyInterface.dll,它包含一个接口:IMyInterface。
上面的层我在一个单独的dll/程序集中有实现,我们称之为MyInterfaceImplementation.dll。
在中间/中间我有一个自动化的测试框架,它可以依赖于IMyInterface.dll,但不依赖于MyInterfaceImplementation.dll。
现在,这个测试框架使用通过反射实例化类型的生产代码基础结构。它是一个依赖注入类型的框架。 因此,您对生产代码基础结构说,从这个程序集中给我这个接口实现。
在我们的例子中,您说从MyInterfaceImplementation.dll给我一个IMyInterface接口。 在测试框架中,您不能依赖MyInterfaceImplementation,因此您可以在第三个程序集中基于IMyInterface定义一个伪/stub/mock类,让我们调用它:MyInterfaceFakeImplementation.dll
在测试框架中,你说从MyInterfaceFakeImplementation.dll给我一个IMyInterface,你就没事了。
注意:如果要更改模块层次结构,则无法重新构造依赖项。关于模拟框架,我不控制实例化。实例化是在依赖项注入框架内完成的

在MyInterfaceFakeImplementation.dll中编写代码时,您可以这样写:

类MyInterfaceFakeImplementation:IMyInterface
{
//imy接口实现。
}
现在我想提供的是IMyInterface的动态类,所以当接口发生变化时,我不需要修改它

这是我想要的:

给定:
IMyInterface.dll中的IMyInterface接口
MyInterfaceFakeImplementation在MyInterfaceFakeImplementation.dll中实现IMyInterface接口
MyInterfaceFakeImplementation具有空函数并返回默认值

时间:
我更改IMyInterface(例如更改函数签名)

然后:
我不需要更改MyInterfaceFakeImplementation,只需重新编译MyInterfaceFakeImplementation.dll。注意:无法生成此程序集,需要编译

这里有一个解决方法。
在IMyInterface.dll中的IMyInterface旁边执行一个伪实现(类),我们称之为MyInterfaceFakeBase。 在MyInterfaceFakeImplementation.dll中,从该基类MyInterfaceFakeBase派生MyInterfaceFakeImplementation,并将其保留为空。 更改接口(IMyInterface)时,请调整MyInterfaceFakeBase,不要担心MyInterfaceFakeImplementation和MyInterfaceFakeImplementation.dll

Okie,对于那些想在这里开始编码的人来说,这是一个示例控制台类型的应用程序,可能会有所帮助。在此代码中添加一个类,以便它找到实现接口的类型,如果更改接口,则不需要更改该类。(不要修改主功能。)

使用系统;
使用System.Collections.Generic;
使用System.Linq;
运用系统反思;
使用系统文本;
使用System.Threading.Tasks;
命名空间DynamicFake3
{
公共接口IMyInterface
{
void SimpleMethod();
bool SimpleFunction();
void OneParameterMethod(inti);
}
班级计划
{
静态void Main(字符串[]参数)
{
Assembly anAssembly=Assembly.LoadFrom(“DynamicFake3.exe”);
foreach(在anaAssembly.GetTypes()中键入aType)
{
if(aType.GetInterfaces()包含(typeof(IMyInterface)))
{
Console.WriteLine(aType.FullName);
}
}
}
}
}
再见
拉兹洛

没有人回答,所以这样做是不可能的。
可以在运行时为接口创建动态装饰器、代理或模拟,也可以生成具有假接口实现的程序集,但这不是我希望的方式。C#,.NET,CLR不允许这样做。或者更好地说,C不允许这种动态(解释)行为是一件好事。

您可以使用类型转发来声明类型已移动到运行时生成的程序集中(请参见assemblybuilder),您可以在其中发出您的类型(请参见typebuilder)。

您知道用于单元测试的框架,对吗?它们或多或少都和你描述的一样。很抱歉拼写错误,问题有点:我不能在上面定义动态模拟,因为实例化是通过反射自动完成的。需要让这一点更加明显。尽管我理解你的问题和限制条件,但我会要求你修改它,不要以多种方式多次重复问题场景。你是一个与众不同的人。:-)需要查找此类型的转发。:-)我将写下我的发现。:-)