2

これは私のジェネリッククラスです:

public class MyClass<T>
{
    public T MainModel { get; set; }

    public Type GetType()
    {
        //here
    }
}

それから私はそれをこの形で使います:

List<MySecondClass> Myinstance = new List<MySecondClass>();

MyClass<IEnumerable<MySecondClass>> mainInstance = new  MyClass<IEnumerable<MySecondClass>> { MainModel = Myinstance  };

だから私はあなたの提案が何であるかをGetType()返すメソッドが必要ですか?typeof(MySecondClass)

アップデート

私は常に2つの形式で使用することを言及しなければなりませんMyClass:最初:私は上で正確にコーディングしましたそして2番目:

ThirdClass thirdone = new ThirdClass(); 
MyClass<ThirdClass> = new MyClass<ThirdClass>(){ MainModel = thirdone};
4

3 に答える 3

6

もしそうTならList<T>

// add error checking to taste
var typeOfEnumerable = typeof(T).GetInterfaces().Where(i => i.IsGenericType)
    .Single(i => i.GetGenericTypeDefinition() == typeof(IEnumerable<>))
    .GetGenericArguments().First();

実際に見てください

もしそうTならIEnumerable<T>

// add error checking to taste
var typeOfEnumerable = typeof(T).GetGenericArguments().First();

重要事項

ここで何をしようとしているのかを本当に考えるべきMyClassです。Tであることを特殊なケースにしたいのはなぜIEnumerable<X>ですか?おそらく、いくつかの制約を追加する必要がありますTか? より具体的な情報がなければ、これらの質問やその他の重要な質問に回答することはできませんが、実際に回答する必要があります。

また、メソッドに名前を付けたのはGetType偶然ですか、それとも意図的にですか? そのように非表示にするのは本当に、本当に、本当に良い考えではないobject.GetTypeので、そのメソッドの名前を変更することをお勧めします。

于 2012-04-18T11:12:19.727 に答える
2

編集: 読むのが速すぎます。申し訳ありません。

var t = typeof(T);
if (t.IsGenericType)
{
    return t.GetGenericArguments().FirstOrDefault();
}
于 2012-04-18T11:09:33.220 に答える
0

IEnumerable<T>さまざまなケースで使用されていると考えてください。

例:

  • MyClass<IEnumerable<MySecondClass>>:あなたが言ったように、あなたが欲しいMySecondClass
  • MyClass<List<MySecondClass>>: おそらく欲しいMySecondClass
  • MyClass<Dictionary<Guid, MySecondClass>>:またMySecondClass?それともKeyValuePair<Guid, MySecondClass>
  • MyClass<MyOwnStringList>: MyOwnStringList が実装されIEnumerabl<string>ます。クラス自体には一般的な引数はありません。その例はたくさんあります。
  • MyClass<string>: string が を実装していると考えましたIEnumerable<char>か?
  • クラスは複数のIEnumerable<T>定義を実装できます。

これらのケースを検討した後、何をすべきかを決定する必要があります。

  • インターフェイスを検索してIEnumerable<T>、ジェネリック引数を抽出できます。1つ以上ある場合があります。文字列には例外がある場合があります。
  • IEnumerable<T>ジェネリック引数を取得しようとするのをあきらめるかもしれません。
  • 直接 (サブタイプなし)のみをサポートしたい場合があります。IEnumerable<T>たとえば、IList<T>.
于 2012-04-18T11:51:19.347 に答える