System.Type
で与えられた型名のみを取得したいstring
。
たとえば、オブジェクトがある場合:
MyClass abc = new MyClass();
それから私は言うことができます:
System.Type type = abc.GetType();
しかし、私が持っているのは次のとおりです。
string className = "MyClass";
System.Type
で与えられた型名のみを取得したいstring
。
たとえば、オブジェクトがある場合:
MyClass abc = new MyClass();
それから私は言うことができます:
System.Type type = abc.GetType();
しかし、私が持っているのは次のとおりです。
string className = "MyClass";
クラスがどのアセンブリであるかによって異なります。それがアセンブリ内にある場合、mscorlib
またはアセンブリを呼び出している場合、必要なのはそれだけです
Type type = Type.GetType("namespace.class");
ただし、他のアセンブリから参照されている場合は、次のことを行う必要があります。
Assembly assembly = typeof(SomeKnownTypeInAssembly).Assembly;
Type type = assembly.GetType("namespace.class");
//or
Type type = Type.GetType("namespace.class, assembly");
クラス名が「MyClass」しかない場合は、何らかの方法で名前空間名 (または参照アセンブリの場合は名前空間名とアセンブリ名の両方) を取得し、それをクラス名と連結する必要があります。何かのようなもの:
//if class is in same assembly
var namespace = typeof(SomeKnownTypeInNamespace).Namespace;
Type type = Type.GetType(namespace + "." + "MyClass");
//or for cases of referenced classes
var assembly = typeof(SomeKnownTypeInAssembly).Assembly;
var namespace = typeof(SomeKnownTypeInNamespace).Namespace;
Type type = assembly.GetType(namespace + "." + "MyClass");
//or
Type type = Type.GetType(namespace + "." + "MyClass" + ", " + assembly.GetName().Name);
まったく何も (アセンブリ名または名前空間名も事前に認識されていない) あり、クラス名だけがある場合は、アセンブリ全体をクエリして、一致する文字列を選択できます。しかし、それはもっと遅くなるはずです:
Type type = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(x => x.GetTypes())
.FirstOrDefault(x => x.Name == "MyClass");
これは最初に一致するクラスを返すため、アセンブリ/名前空間で同じ名前のクラスが複数ある場合は、それほど正確である必要はありません。いずれにせよ、値をキャッシュすることはここでは理にかなっています。少し速い方法は、デフォルトの名前空間が 1 つあると仮定することです。
Type type = AppDomain.CurrentDomain.GetAssemblies()
.Select(a => new { a, a.GetTypes().First().Namespace })
.Select(x => x.a.GetType(x.Namespace + "." + "MyClass"))
.FirstOrDefault(x => x != null);
ただし、これもまた、型がアセンブリ内の他のランダム クラスと同じ名前空間を持つことを前提としています。もろすぎる、あまり良くない。
他のドメインのクラスが必要な場合は、このリンクに従って、すべてのアプリケーション ドメインのリストを取得できます。次に、各ドメインに対して上記と同じクエリを実行できます。タイプが存在するアセンブリがまだロードされていない場合はAssembly.Load
、Assembly.LoadFrom
などを使用して手動でロードする必要があります。
Type type = Type.GetType("foo.bar.MyClass, foo.bar");
MSDN . 名前がAssembly Qualifiedであることを確認してください。
型を取得した後にクラスのインスタンスを作成し、メソッドを呼び出すには -
Type type = Type.GetType("foo.bar.MyClass, foo.bar");
object instanceObject = System.Reflection.Activator.CreateInstance(type);
type.InvokeMember(method, BindingFlags.InvokeMethod, null, instanceObject, new object[0]);
Type type = Type.GetType("MyClass");
名前空間を必ず含めてください。大文字と小文字の区別と、型名が見つからない場合に例外をスローするかどうかを制御するメソッドのオーバーロードがあります。
現在のアセンブリまたは別のアセンブリから型を取得する別の方法。
(クラスの名前空間にそのアセンブリが含まれていると仮定します):
public static Type GetType(string fullName)
{
if (string.IsNullOrEmpty(fullName))
return null;
Type type = Type.GetType(fullName);
if (type == null)
{
string targetAssembly = fullName;
while (type == null && targetAssembly.Length > 0)
{
try
{
int dotInd = targetAssembly.LastIndexOf('.');
targetAssembly = dotInd >= 0 ? targetAssembly.Substring(0, dotInd) : "";
if (targetAssembly.Length > 0)
type = Type.GetType(fullName + ", " + targetAssembly);
}
catch { }
}
}
return type;
}
名前とパラメーターから新しいオブジェクトを作成して初期化する簡単な方法を次に示します。
// Creates and initializes a new object from its name and parameters
public Object CreateObjectByName(string name, params Object[] args)
{
string s = "<prefix>" + name; // case sensitive; Type.FullName
Type type = Type.GetType(s);
Object o = System.Activator.CreateInstance(type, args);
return o;
}
これを使用する方法の 1 つの例は、クラス名 [または部分的なクラス名] とパラメーターを含むファイルを読み取り、返されたオブジェクトを、作成されたオブジェクトに共通の基本型のオブジェクトのリストに追加することです。
クラス名[または]がどのように見えるかを確認するには、一時的に次のようなものを使用します[クラスの名前がNewClassの場合]:
string z = (new NewClass(args)).GetType().FullName;
Type.GetType(...)
typeof
演算子が使用できない場合、失敗することがあります。
代わりに、現在のドメインからのアセンブリを反映して、それを行うことができます。
このスレッドで私の応答を確認してください