web-dev-qa-db-ja.com

C#-名前空間、クラス、またはメソッドがC#に存在するかどうかを確認する方法

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

Type.GetType(string) to reflect を使用できます。タイプが見つからなかった場合、GetTypeはnullを返します。型が存在する場合、返されたGetMethodからGetFieldGetPropertyTypeなどを使用して、関心のあるメンバーかどうかを確認できます。存在します。

更新 あなたの例:

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

これは、タイプが現在実行中のAssembly、mscorlib(.NET Coreがこれにどのように影響するかわからない、おそらくSystem.Runtime代わりに?)、またはタイプに アセンブリ修飾名 があります。 GetTypeに渡す文字列引数がこれらの3つの要件を満たしていない場合、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);
42
HackedByChinese

Type.GetType(String) メソッドを使用して、文字列から Type を解決できます。例えば:

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);
33
Matthew King

1つの単語: Reflection 。名前空間を除き、タイプ名からそれらを解析する必要があります。

EDIT:ストライク-名前空間の場合、Type.Namespaceプロパティを使用して、各クラスが属する名前空間を決定する必要があります。 (詳細については HackedByChinese response をご覧ください)。

2
M.Babcock