项目之间的Type.GetType()可见性问题(Visual C#)

时间:2013-03-13 16:15:50

标签: c# reflection null project gettype

我遇到了一个奇怪的问题。我正在研究一个动态工厂项目,我的目的是能够基于XML文件创建新对象。我的问题是:

  1. 我有一个单独的项目,用于我所在工厂的基类

    public abstract class DynamicContentFactory<T, Params> where T: class where Params: DynamicParameters
    
  2. 在这个抽象类中,我有一个静态方法Create,如下所示

    public static T Create(Params data)
    
  3. Params只包含一个字符串作为默认名为Type的字符串。我想将对象的创建限制为与基类T相同的命名空间,因此我执行以下操作:

    string namespaceStr = typeof(T).ToString();
    namespaceStr = namespaceStr.Substring(0, namespaceStr.LastIndexOf('.') + 1);
    
    Type type = Type.GetType(namespaceStr + data.Type);
    
  4. 在我的主项目中,我有一个特定的工厂类

    public class ItemFactory : DynamicContent.DynamicContentFactory<ItemFactory, ItemParameters>
    {
    }
    
  5. 问题在于,当我致电ItemFactory.Create时,Type.GetType会返回nullItemFactory与我希望它创建的项目位于同一名称空间中,但基类位于另一个名称中。有没有办法解决这个问题?

  6. 我尝试将Type.GetType()的参数更改为typeof(T).ToString(),以便测试是否可以找到它并且也找不到它。我无法创建从我的DynamicContent项目到我的主项目的链接,因为已存在指向其他方式的链接。我觉得很难找到它初始化的类的类型。

  7. 所以我的问题是:解决这个问题的最佳方法是什么?我宁愿将我的DynamicContent项目作为一个单独的库保存在一个单独的项目中,而不是必须将它包含在我的主项目中。有没有办法让它找到类或者我必须为我想要初始化的类型创建第三个项目,以便能够从主项目和DynamicContent项目中引用它? / p>

    BR,

    -Sami

1 个答案:

答案 0 :(得分:4)

您正在观察的行为是预期的 - Type.GetType

  

typeName - 要获取的类型的程序集限定名称。请参阅AssemblyQualifiedName。如果类型在当前正在执行的程序集中或在Mscorlib.dll中,则提供由其名称空间限定的类型名称就足够了。

请注意,您当前的代码是有效的,因为它属于指定行为的“当前正在执行的程序集”部分,其中只有名称空间+名称就足够了。

  • 您在请求时应指定类型的全名,但您可以检查该类型将使用的命名空间。
  • 您可以切换到Assembly.GetType而不是Type.GetType,并使用T的程序集来查找要创建的类型。
  • 替代方法是扫描所有已加载的程序集以查找所需的类型,但如果类型来自尚未加载的程序集,则可能还不够。

剩余:.Net中的命名空间名称并不重要 - 它们是使代码更具可读性的惯例,但是在它中实现的程序集和命名空间之间没有特定的链接。