0

我希望能够尝试使用Activator.CreateInstance.

目前,我根据从我正在扩展的第 3 方应用程序中检索到的一些元数据构建了一个完全限定的类名。然后使用公共基类创建此类名称Activator.CreateInstance并将其转换为公共基类。

我正在寻找类似的东西:

string className = "MyNamespace." + "some_arbitary_class_name";
if (Assembly.ClassExists(className))
{
     // Create the class.
}

目前我有这个:

 string class_name = "MyNamespace.BaseClassImpl_" + meta_data;
 MyBaseClass baseClass = null;
 try
 {
     baseClass = (BaseClass)Activator.CreateInstance(null, class_name);
 }
 catch (Exception e) { }
 // If base class in null, failed.

我知道我需要用来System.Reflection检查当前的程序集,但我不知道我需要使用的确切方法。

所以我的问题是双重的:

  1. 有人可以指导我使用我需要用来完成此操作的 .NET api 吗?
  2. 在创建类之前验证类是否存在是一种好习惯吗?还是我应该让try-catch块处理它?
4

2 回答 2

3

您可以执行一个Assembly.GetType ("assembly") 并查看它是否返回 null,还有另一个重载允许您指定是否在类型不存在时抛出的参数。

如果可以的话,我会说最好避免异常,至少它可能会使您的代码更难阅读。

于 2013-09-06T04:43:08.017 回答
0

Daniel Powells 的回答正是我完成这项工作所需要的。

最后,这是我用来实现我需要做的代码的粗略翻译:

class MyBaseClass
{   }

class MyBaseClass_impl : MyBaseClass
{   }

public MyBaseClass CreateFromMetaData(string metaData)
{
    string className = "MyNamespace.MyBaseClass_" + metaData;
    Type t = System.Reflection.Assembly.GetExecutingAssembly().GetType(className, false);
    if (t != null)
    {
        return (MyBaseClass)Activator.CreateInstance(t);
    }

    return null;
}

在此之后,"impl"用作参数 forCreateFromMetaData将返回一个新MyBassClass_impl对象,而任何其他字符串将返回 null。

于 2013-09-06T06:36:35.620 回答