检查当前.NET程序集中是否存在类

时间:2013-09-06 04:38:58

标签: c# .net reflection

我希望能够验证当前程序集中是否存在类尝试使用Activator.CreateInstance创建它。

目前,我根据从我正在扩展的第三方应用程序中检索到的一些元数据构建了一个完全限定的类名。然后使用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块处理它吗?

2 个答案:

答案 0 :(得分:2)

您可以执行Assembly.GetType(“程序集”)并查看是否返回null,还有另一个overload允许您指定是否抛出的参数(如果类型不存在)

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

答案 1 :(得分: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"作为CreateFromMetaData的参数将返回一个新的MyBassClass_impl对象,而任何其他字符串将返回null。