C# - 如何检查C#中是否存在名称空间,类或方法?

时间:2011-12-14 04:47:19

标签: c# class methods namespaces

我有一个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);

3 个答案:

答案 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。)