基于接口字符串名称实例化类



我有一个类实现了这样的接口;

... = new Location<ICafe>();
... = new Location<IBusiness>();
etc

如果我想扩展Location类型的数量,我现在需要编辑代码。

有没有一种方法可以根据接口的字符串名称实例化类?

因此,我会从数据库中获取Cafe或Business,并使用接口的字符串名称实例化上面的内容。

编辑

我应该注意,我稍后在代码中使用ICafe、IBusiness等来确定这是什么类型的项目以及在屏幕上显示什么。

是的,反射可以让你做到这一点,但需要几个步骤:

  • 获取与名称对应的System.Type,例如ifaceType = Type.GetType(string)

  • 获取与泛型类型模板对应的System.Type,从任何一组参数开始,例如genericType = typeof (Location<ICafe>).GetGenericTypeDefinition()

  • 两者结合:specificType = genericType.MakeGenericType(ifaceType)

  • 创建实例:Activator.CreateInstance(specificType)

在我看来,你可能会从更抽象中受益。有什么原因不能拥有名为的超级接口吗

interface IAbstractLocation 

然后,使用适当的接口创建具体的类,但这些接口继承自AbstractLocation类型:

interface ICafe : IAbstractLocation
interface IBusiness : IAbstractLocation

然后你会有1种类型:

...Location<IAbstractLocation>();

它应该处理您可能添加的从IAbstractLocation接口继承的任何新类型。

最新更新