我有一个C#程序,如果存在命名空间,类或方法,我如何在运行时检查?另外,如何使用字符串形式的名称来实例化一个类?
伪代码:
string @namespace = "MyNameSpace";
string @class = "MyClass";
string method= "MyMEthod";
var y = IsNamespaceExists(namespace);
var x = IsClassExists(@class)? new @class : null; //Check if exists, instantiate if so.
var z = x.IsMethodExists(method);
答案 0 :(得分:41)
您可以使用Type.GetType(string)来反映课程。 Type
具有发现该类型可用的其他成员(包括方法)的方法。
然而,一个技巧是GetType
需要一个程序集限定名称。如果您只使用类名本身,则会假定您引用了当前程序集。
所以,如果你想在所有加载的程序集中找到类型,你可以这样做(使用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);
答案 1 :(得分:31)
您可以使用Type方法从字符串中解析Type.GetType(String)。 例如:
Type myType = Type.GetType("MyNamespace.MyClass");
然后,您可以使用此Type实例通过调用GetMethod(String)方法检查类型上是否存在方法。 例如:
MethodInfo myMethod = myType.GetMethod("MyMethod");
如果找不到给定名称的类型或方法,GetType和GetMethod都返回null
,因此您可以通过检查方法调用是否返回null来检查您的类型/方法是否存在。
最后,您可以使用Activator.CreateInstance(Type)实例化您的类型 例如:
object instance = Activator.CreateInstance(myType);
答案 2 :(得分:2)
一个字:Reflection。除了命名空间之外,您还必须解析类型名称中的那些。
编辑:打击 - 对于命名空间,您必须使用Type.Namespace属性来确定每个类所属的命名空间。 (有关详细信息,请参阅HackedByChinese response。)