从.NET 4.0中的ObservableCollection <t>获取T类型的优雅方法</t>

时间:2012-10-24 15:22:03

标签: c# types observablecollection

  

可能重复:
  C# generic list <T> how to get the type of 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().....
}

由于

3 个答案:

答案 0 :(得分:1)

您可以将集合传递给通用函数

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

然后可以像collection.AddUnknown(obj)

一样使用它

如果编译器不知道您正在使用哪个ObservableCollection,则必须提供该信息,除非您愿意使用反射

答案 1 :(得分: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);
}

答案 2 :(得分: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);