web-dev-qa-db-ja.com

テキスト名からクラスをインスタンス化します

理由は聞かないでくださいが、次のことをする必要があります。

_string ClassName = "SomeClassName";  
object o = MagicallyCreateInstance("SomeClassName");
_

これを行う方法がいくつあるか、どのシナリオでどのアプローチを使用するかを知りたい。

例:

  • _Activator.CreateInstance_
  • Assembly.GetExecutingAssembly.CreateInstance("")
  • 他の提案をいただければ幸いです

この質問は、自由に話し合うことを意図したものではありません。これを達成できる方法は非常に多くあると確信しているからです。

35
Raheel Khan

メソッドは次のようになります。

private static object MagicallyCreateInstance(string className)
{
    var Assembly = Assembly.GetExecutingAssembly();

    var type = Assembly.GetTypes()
        .First(t => t.Name == className);

    return Activator.CreateInstance(type);
}

上記のコードは次のことを前提としています。

  • 現在実行中のアセンブリにあるクラスを探しています(これは調整できます-Assemblyを必要なものに変更するだけです)
  • そのアセンブリで探している名前のクラスが1つだけあります
  • クラスにはデフォルトのコンストラクタがあります

更新:

特定のクラスから派生する(同じアセンブリで定義されている)すべてのクラスを取得する方法は次のとおりです。

private static IEnumerable<Type> GetDerivedTypesFor(Type baseType)
{
    var Assembly = Assembly.GetExecutingAssembly();

    return Assembly.GetTypes()
        .Where(baseType.IsAssignableFrom)
        .Where(t => baseType != t);
}
48
Activator.CreateInstance(Type.GetType("SomeNamespace.SomeClassName"));

または

Activator.CreateInstance(null, "SomeNamespace.SomeClassName").Unwrap();

コンストラクター引数を指定できるオーバーロードもあります。

17
Balazs Tihanyi