1

重複の可能性:
文字列値からのジェネリック型

与えられたシナリオ、 Class Car: TransportClass Bus: TransportInterface Transport
Get(): Generics Method

このようなことは可能ですか?

Transport t= Get<"Car">(string color);

public T Get<T>(string color)
{
  return new T(color);
}

P/S: 戻り値の型に関係なく、動的に文字列として割り当てる理由があります。

4

4 に答える 4

2

文字列を操作したい場合は、次の 2 つのオプションがあります。タイプをパラメーターとして取るGet非ジェネリックを追加します。Get

public object Get(Type t);

そのため、文字列から作成された型を渡すことができます。2 番目のオプションはリフレクションです。

MethodInfo method = typeof(YourType).GetMethod("Get");
MethodInfo generic = method.MakeGenericMethod(myType);

次に、タイプ myType に閉じられているかのようにジェネリックを呼び出すことができます。

どちらを使用するかを提案でき、メソッドをリファクタリングできる場合は、Getそのメソッドの非汎用バージョンを追加することをお勧めします。ライブラリ コードを本当に変更できない場合は、リフレクション バージョンが機能します。おそらくご想像のとおり、リフレクションを使用することの欠点はパフォーマンスです。リフレクションを使用できるかどうかを判断できます。

編集

もちろん、メソッドが実際に最終的なオブジェクトを作成するだけの場合、私の議論は当てはまりません:

この場合、アクティベーターは完全な型名を渡すことでチャームとして機能します。

Activator.CreateInstance(Type.GetType("yourtypename"));

タイプが ExecutingAssembly でない場合は名前空間とアセンブリで完全修飾する必要があるため、通常は単純な名前 ( Car、Bus など) だけに基づいてタイプを作成できます。この場合、コードの読みやすさを簡素化するために、何らかの規則/構成を使用する必要があります。

添加

パラメーターも渡す必要がある場合は、これらすべての問題を解決できる単純なIoC (特にお勧めしません。広く使用されているものを選択してください) を使用してみてください。

于 2012-12-29T17:44:00.780 に答える
1

コンパイル時にクラスの名前がわからないと、ジェネリックを使用できません。ただし、使用できActivator.CreateInstanceます:

object obj = Activator.CreateInstance(Type.GetType(assemblyQualifiedTypeName));

これは、作成している型にデフォルトのコンストラクターがあることを前提としています。

于 2012-12-29T17:43:34.277 に答える
0

リフレクションを使用して型名から型への参照を取得し、それを使用Activator.CreateInstanceしてインスタンスを作成します。

于 2012-12-29T17:42:00.490 に答える
0

いいえ、コンパイル時にジェネリック引数を解決する必要があるため、ジェネリックではありません。

ただし、型をパラメーターの文字列として渡し、メソッドが「動的」を返すようにすることもできます。

var aCar = Get("Car") as Car;

public dynamic Get(string type)
{
  return Activator.CreateInstance(Type.GetType(type));
}
于 2012-12-29T17:42:49.140 に答える