您可以使用Type.GetType(string) 到reflect 一个类型。如果找不到类型,GetType 将返回 null。如果该类型存在,则可以从返回的Type 中使用GetMethod、GetField、GetProperty 等来检查您感兴趣的成员是否存在。
Update 你的例子:
string @namespace = "MyNameSpace";
string @class = "MyClass";
string method= "MyMEthod";
var myClassType = Type.GetType(String.format("{0}.{1}", @namespace, @class));
object instance = myClassType == null ? null : Activator.CreateInstance(myClassType); //Check if exists, instantiate if so.
var myMethodExists = myClassType.GetMethod(method) != null;
Console.WriteLine(myClassType); // MyNameSpace.MyClass
Console.WriteLine(myMethodExists); // True
这是最有效和首选的方法,假设类型在 当前正在执行的程序集中,在 mscorlib 中(不确定 .NET Core 对此有何影响,也许是 System.Runtime?),或者你有一个assembly-qualified name 类型。如果您传递给GetType 的字符串参数不满足这三个要求,GetType 将返回 null(假设没有其他类型不小心与这些要求重叠,哎呀)。
如果您没有具有程序集限定名称,则您需要修正您的方法以便执行或执行搜索,后者可能会慢得多。
如果我们假设您确实想在所有加载的程序集中搜索类型,您可以执行以下操作(使用 LINQ):
var type = (from assembly in AppDomain.CurrentDomain.GetAssemblies()
from type in assembly.GetTypes()
where type.Name == className
select type);
当然,可能还不止这些,您需要反映可能尚未加载的引用程序集,等等。
至于确定命名空间,反射不会明确地导出它们。相反,您必须执行以下操作:
var namespaceFound = (from assembly in AppDomain.CurrentDomain.GetAssemblies()
from type in assembly.GetTypes()
where type.Namespace == namespace
select type).Any()
把它们放在一起,你会得到类似的东西:
var type = (from assembly in AppDomain.CurrentDomain.GetAssemblies()
from type in assembly.GetTypes()
where type.Name == className && type.GetMethods().Any(m => m.Name == methodName)
select type).FirstOrDefault();
if (type == null) throw new InvalidOperationException("Valid type not found.");
object instance = Activator.CreateInstance(type);