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 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 回答
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 回答
0

有两种方法可以处理对象:

  • 使用反射(你告诉它是不可取的)
  • 试错
  • 使用足够广泛的基类或接口

试错

尝试所有您期望可能的变化:

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 回答