我希望能够验证当前程序集中是否存在类>尝试使用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
来检查当前的程序集,但我不知道我需要使用的确切方法。
所以我的问题有两个:
try-catch
块处理它吗?答案 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。