6

私は現在、ジェネリックスを使用して、オブジェクトの作成やプロパティへの値の入力など、いくつかの動的なメソッドを作成しています。

タイプを知らなくても「動的に」ジェネリックを作成する方法はありますか?例えば:

List<String> = new List<String>()

事前に定義された方法ですが、

List<(object.GetType())> = new List<(object.GetType()>()

動作していません...しかし、それはできますか?

これは機能していません(機能する同様のアプローチはありますか?)

    public T CreateObject<T>(Hashtable values)
    {
        // If it has parameterless constructor (I check this beforehand)
        T obj = (T)Activator.CreateInstance(typeof(T));

        foreach (System.Reflection.PropertyInfo p in typeof(T).GetProperties())
        {
            // Specifically this doesn't work
            var propertyValue = (p.PropertyType)values[p.Name];
            // Should work if T2 is generic
            // var propertyValue = (T2)values[p.Name];

            obj.GetType().GetProperty(p.Name).SetValue(obj, propertyValue, null);
        }
    }

つまり、ジェネリックスを使用せずに「タイプ」を取得してそこからオブジェクトを作成する方法は?これまでメソッドでジェネリックを使用しただけですが、変数でも同じように使用できますか?メソッドの前にGeneric(T)を定義する必要があるので、変数を「作成」する前に変数に対して同じことを行うことはできますか?

...または「アクティベーター」を使用して、パラメーターの代わりにプロパティを使用してオブジェクトを作成する方法。あなたがここで行うように:

//パラメータ値を使用

Test t = new Test("Argument1", Argument2);

//プロパティ付き

Test t = new Test { Argument1 = "Hello", Argument2 = 123 };
4

3 に答える 3

13

あなたが使用することができますMakeGenericType

Type openListType = typeof(List<>);
Type genericListType = openListType.MakeGenericType(obj.GetType());
object instance = Activator.CreateInstance(genericListType);
于 2012-05-22T19:44:46.747 に答える
6

MakeGenericTypeメソッドを使用して、特定の型引数のジェネリック型を取得できます。

var myObjListType = typeof(List<>).MakeGenericType(myObject.GetType());
var myObj = Activator.CreateInstance(myObjListType);
// MyObj will be an Object variable whose instance is a List<type of myObject>
于 2012-05-22T19:44:42.747 に答える
1

オブジェクト初期化子を使用する場合は、デフォルトのコンストラクター(パラメーターなし)を使用し、オブジェクトの作成後に個々のプロパティを設定します。

上記のコードは近いですがvar、コンパイル時の型推論であるため、ここでは機能しません。すでにリフレクションを使用しているので、次を使用できますSystem.Object

object propertyValue = values[p.Name];

SetValue呼び出しはで正常に機能しますSystem.Object

于 2012-05-22T19:41:46.367 に答える