我有一个单独的项目,用于我所在工厂的基类
public abstract class DynamicContentFactory<T, Params> where T: class where Params: DynamicParameters
在这个抽象类中,我有一个静态方法Create
,如下所示
public static T Create(Params data)
Params
只包含一个字符串作为默认名为Type
的字符串。我想将对象的创建限制为与基类T
相同的命名空间,因此我执行以下操作:
string namespaceStr = typeof(T).ToString();
namespaceStr = namespaceStr.Substring(0, namespaceStr.LastIndexOf('.') + 1);
Type type = Type.GetType(namespaceStr + data.Type);
在我的主项目中,我有一个特定的工厂类
public class ItemFactory : DynamicContent.DynamicContentFactory<ItemFactory, ItemParameters>
{
}
问题在于,当我致电ItemFactory.Create
时,Type.GetType
会返回null
。 ItemFactory
与我希望它创建的项目位于同一名称空间中,但基类位于另一个名称中。有没有办法解决这个问题?
我尝试将Type.GetType()
的参数更改为typeof(T).ToString()
,以便测试是否可以找到它并且也找不到它。我无法创建从我的DynamicContent
项目到我的主项目的链接,因为已存在指向其他方式的链接。我觉得很难找到它初始化的类的类型。
所以我的问题是:解决这个问题的最佳方法是什么?我宁愿将我的DynamicContent
项目作为一个单独的库保存在一个单独的项目中,而不是必须将它包含在我的主项目中。有没有办法让它找到类或者我必须为我想要初始化的类型创建第三个项目,以便能够从主项目和DynamicContent
项目中引用它? / p>
BR,
-Sami
答案 0 :(得分:4)
您正在观察的行为是预期的 - Type.GetType
typeName - 要获取的类型的程序集限定名称。请参阅AssemblyQualifiedName。如果类型在当前正在执行的程序集中或在Mscorlib.dll中,则提供由其名称空间限定的类型名称就足够了。
请注意,您当前的代码是有效的,因为它属于指定行为的“当前正在执行的程序集”部分,其中只有名称空间+名称就足够了。
Type.GetType
,并使用T
的程序集来查找要创建的类型。剩余:.Net中的命名空间名称并不重要 - 它们是使代码更具可读性的惯例,但是在它中实现的程序集和命名空间之间没有特定的链接。