gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 04:00:56 33 4
gpt4 key购买 nike

我有一个 C# 程序,如何在运行时检查 namespace 、类或方法是否存在?另外,如何通过使用字符串形式的名称来实例化类?

伪代码:

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);

最佳答案

您可以使用 Type.GetType(string)reflect一种。如果找不到类型,GetType 将返回 null。如果类型存在,则可以使用 GetMethodGetFieldGetProperty 等从返回的 Type 到检查您感兴趣的成员是否存在。

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);

当然,可能还不止于此,您需要在其中反射(reflect)可能尚未加载的引用程序集等。

至于确定 namespace ,反射不会清楚地导出这些 namespace 。相反,您必须执行以下操作:

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);

关于C# - 如何检查 C# 中是否存在命名空间、类或方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8499593/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com