【问题标题】:Type.GetType() visibility issue between projects (Visual C#)项目之间的 Type.GetType() 可见性问题 (Visual C#)
【发布时间】:2013-03-01 16:57:14
【问题描述】:

我遇到了一个特殊的问题。我正在开发一个动态工厂项目,我的目的是能够基于 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 与我希望它创建的 Items 位于同一个命名空间中,但基类位于另一个名称空间中。有没有办法解决这个问题?

  6. 我试过把Type.GetType()的参数改成typeof(T).ToString(),测试能不能找到,也没有找到。我无法创建从我的DynamicContent 项目到我的主项目的链接,因为已经存在指向其他方式的链接。我觉得它甚至找不到它初始化的类的类型是愚蠢的。

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

BR,

-萨米人

【问题讨论】:

    标签: c# reflection null project gettype


    【解决方案1】:

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

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

    请注意,您当前的代码可以正常工作,因为它属于指定行为的“当前执行程序集”部分,其中仅命名空间+名称就足够了。

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

    其余:.Net 中的命名空间名称意义不大 - 它们是使代码更具可读性的约定,但在程序集和其中实现的命名空间之间没有特定的联系。

    【讨论】:

    • 谢谢!这澄清了一点。当我通过调用 Assembly.GetCallingAssembly().GetType() 设法解决它时,我刚刚发现了一些类似的东西。我想这样做会很糟糕,因为我们不能保证 CallingAssembly 包含 T。
    • 不要忘记命名空间的其他一些功能,例如解决具有相同名称的类型之间的歧义等
    猜你喜欢
    • 2012-06-15
    • 2011-09-13
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多