1

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

  6. 我尝试将参数更改为Type.GetType()totypeof(T).ToString()以测试它是否可以找到它并且它也没有找到它。我无法创建从我的DynamicContent项目到我的主项目的链接,因为指向另一种方式的链接已经存在。我觉得它甚至找不到它初始化的类的类型是愚蠢的。

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

BR,

-萨米

4

1 回答 1

4

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

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

Note that your current code works because it falls under "currently executing assembly" portion of the specified behavior where just namespace+name is enough.

  • You should specify full name of the type when requesting it, but you can check what namespace the type will use.
  • You can switch to Assembly.GetType instead of Type.GetType and use T's assembly to lookup types you want to create.
  • Alternative is to scan all loaded assemblies for type you want, but it may be not enough if the type is coming from not-yet-loaded assembly.

Remainder: namespace names in .Net don't mean much - they are convention to make code more readable, but there is no particular link between assembly and namespaces that are implemented in it.

于 2013-03-13T16:34:02.970 回答