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);
Type.GetType(string) to reflect を使用できます。タイプが見つからなかった場合、GetType
はnullを返します。型が存在する場合、返されたGetMethod
からGetField
、GetProperty
、Type
などを使用して、関心のあるメンバーかどうかを確認できます。存在します。
更新 あなたの例:
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);
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);
1つの単語: Reflection 。名前空間を除き、タイプ名からそれらを解析する必要があります。
EDIT:ストライク-名前空間の場合、Type.Namespaceプロパティを使用して、各クラスが属する名前空間を決定する必要があります。 (詳細については HackedByChinese response をご覧ください)。