0

私は次の機能を持っています

void Func<T>(IEnumerable<T> e)
{
   // Need type of T here
   Type t = e.CollectionElementsType() ???
}

さらに複雑にするために、次のコードがあります

void Func(IEnumerable<object> e)
{
   // Need type of T here
   Type t = e.CollectionElementsType() ???
}

ここで、2番目の実装への次の呼び出しがあるとします

Func(new List<int>().Cast<object>());

Func に int 型を検出させたい。どうすればこれを達成できますか?

4

4 に答える 4

2

質問の場合:typeof(T)動作します。

より一般的には、リフレクションを使用して、 viaeの型パラメーター (<code>T) を抽出できます。IEnumerable<T>Type.GetGenericArguments

于 2013-10-02T16:10:55.853 に答える
1

なぜこれをしないのですか?:

Type t = typeof(T);

typeofについてもっと読む

編集:

より複雑なケースでは、複数のタイプを持つことができるので、これを行うことができます:

IEnumerable<Type> GetTypes (IEnumerable<object> list)
{
    foreach (object a in list)
    {
       yield return a.GetType();
    }
}

本当に 1 つのタイプだけの場合は、 と書くことができますType t = GetTypes(yourEnumerable).FirstOrDefault()GetType()オブジェクトの実際のタイプを取得します。

GetTypeについて読む

于 2013-10-02T16:09:06.797 に答える
1
// returns an enumeration of T where o : IEnumerable<T>
public IEnumerable<Type> GetGenericIEnumerables(object o) {
    return o.GetType()
            .GetInterfaces()
            .Where(t => t.IsGenericType == true
                && t.GetGenericTypeDefinition() == typeof(IEnumerable<>))
            .Select(t => t.GetGenericArguments()[0]);
}
于 2013-10-02T16:09:26.250 に答える
0

TypeTの を取得するには、次を使用します。

void Func(IEnumerable<T> e)
{
    Type t = typeof(T);
}

要素の を取得するTypeには、代わりに最初の項目の型を取得します (リストのすべての項目が同じ型であると仮定します)。

void Func(IEnumerable<T> e)
{
    Type t;
    if(e.Count() > 0){
        t = e.ElementAt(0).GetType();
    }
}
于 2013-10-02T16:16:25.230 に答える