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

本文关键字:集中 是否 存在 程序集 程序 NET 检查 | 更新日期: 2023-09-27 18:30:17

我希望能够在尝试使用 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块处理它?

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

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

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

丹尼尔鲍威尔的回答正是我完成这项工作所需要的。

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

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。