在C#中,我正在开发几个具有一些标准功能的Windows服务,因此我将所有这些常用功能放入一个单独的引用实用程序项目中。
我有一种情况需要使用Activator.CreateInstance从实用程序项目创建驻留在我的Windows服务项目中的业务类实例。
我的实用程序项目知道Type.GetType调用的命名空间和类名,但是类型始终为null,当我考虑它时,它将无法从它引用的项目中获取类型,还是可以吗?
简而言之:
项目A参考公用事业项目 Utility Project希望从项目A创建类,它知道命名空间和类名。
我是否应该遵循设计模式或方法来实现此功能?或者这看起来像是否,不,我应该重构?
感谢您寻找
答案 0 :(得分:4)
你可以使用反射来解决循环引用问题,正如Jon指出的那样,但我建议重新思考设计并重构它。两个建议。
答案 1 :(得分:1)
如果希望Type.GetType
找到不在mscorlib
或调用程序集中的类型,则需要指定完全限定的程序集名称(包括版本等,如果它是强名称的)
例如:
// Prints nothing
Console.WriteLine(Type.GetType("System.Linq.Enumerable"));
// Prints the type name (i.e. it finds it)
Console.WriteLine(Type.GetType("System.Linq.Enumerable, System.Core, "
+ "Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"));
或者,您是否可以在实用程序项目中将其作为通用方法,并让调用者将类型指定为类型参数?
答案 2 :(得分:1)
您可以查看依赖注入/ ioc容器。
例如,在实用程序库中创建一个接口,并在Windows服务的特定类中实现该接口。然后将实例传递给实用程序类。这样,实用程序库对Windows服务一无所知。
答案 3 :(得分:0)
听起来像循环参考问题!你可能需要重构!