3

重複の可能性:
C# ジェネリック リスト <T> T の型を取得するには?

これは簡単な質問です。不明な型の ObservableCollection の型を取得する最もエレガントで簡単な方法は何ですか?

私は方法を持っています:

public void DoSomething(object oc)
{
     //I know 'oc' is a ObservableCollection<T> 
     //How to get its type <T> without having to do
     //obj.GetType().GetProperties().....
}

ありがとう

4

3 に答える 3

1

コレクションをジェネリック関数に渡すことができます

public static void AddUnknown<T>(this ObservableCollection<T> collection, object item){
      collection.Add((T)item);
}

それは次のように使用できますcollection.AddUnknown(obj)

使用している ObservableCollection をコンパイラが認識していない場合は、リフレクションを使用する意思がない限り、その情報を提供する必要があります。

于 2012-10-24T15:28:24.410 に答える
1

あなたのためにそれを行う拡張メソッドを書くことができます

public static Type GetGenericType<T>(this ObservableCollection<T> o)
{
    return typeof(T);
}

こちらもご覧ください: C# Get Generic Type Name

編集:

これは非常に興味深いです:)

動的を使用するソリューションを思いつきました

public static void DoSomething(object o)
{
 var iCollection = o as ICollection;
 if(iCollection != null)
 {
    dynamic oc = iCollection;
    Type t = GetGenericType(oc); 
    // now you got your type :)
 }
}

public static Type GetGenericType<T>( List<T> o)
{
    return typeof(T);
}
于 2012-10-24T15:31:55.547 に答える
0

オブジェクトを操作するには、次の 2 つの方法があります。

  • リフレクションを使用する(望ましくないと言いました)
  • 試行錯誤
  • 十分に広い基本クラスまたはインターフェースを使用する

試行錯誤

可能だと思われるすべてのバリエーションを試してください。

var list1 = oc as ObservableCollection<int>;
var list2 = oc as ObservableCollection<string>;
var list3 = oc as ObservableCollection<MyClass>;

if (list1 != null)
    list1.Add(1);

else if (list2 != null)
    list2.Add("str");

else if (list3 != null)
    list3.Add(new MyClass());

else
    throw new Exception("Unexpected object type.");

広範な基本クラスの使用

 var list = oc as IList;
 list.Add(value);
于 2012-10-24T15:42:39.853 に答える