假设我在一个名为“Interface”的项目中有一个这样的接口:
public interface TestInterface
{
string Operation();
}
以及实现它的类。该类位于另一个项目“Class”中:
public class TestClass : TestInterface
{
public TestClass() { }
public string Operation()
{
return "This is an Operation";
}
}
我的客户做了这样的事情(这又在另一个项目“客户端”中):
class Program
{
static void Main(string[] args)
{
TestInterface i = new TestClass();
i.Operation();
}
}
我的问题与这一行有关:
TestInterface i = new TestClass();
通过添加这一行,我实际上被迫添加对“客户端”项目中的“接口”和“类”项目的引用。那么为什么这么大惊小怪呢?我不能直接引用“类”而不保留“接口”吗?有没有办法仅通过接口访问方法(而不引用实现类)?我在这里错过了什么吗?
有没有办法仅通过接口访问方法
就在这里。您可以动态加载程序集TestClass
不引用它,通过创建它的实例Activator.CreateInstance
并将其转换为接口类型:
var assembly = Assembly.Load(...);
var typeFromAssembly = assembly.GetTypes()...;
var myInterfaceVar = (TestInterface)Activator.CreateInstance(typeFromAssembly);
...或者...您可以使用现有的 DI 框架之一(例如 MEF)并以更正确的方式做同样的事情:
[Import]
private TestInterface myInterfaceField;
or:
var myInterfaceVar = compositionContainer.GetExportedValue<TestInterface>();
根据您喜欢的方式,您可以提出更具体的问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)