C# 从ObservableCollection获取T型的优雅方式<;T>;在.NET4.0中

C# 从ObservableCollection获取T型的优雅方式<;T>;在.NET4.0中,c#,types,observablecollection,C#,Types,Observablecollection,可能重复: 这是一个简单的问题。最优雅、最简单的方式是什么 未知类型的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().GetProperti

可能重复:

这是一个简单的问题。最优雅、最简单的方式是什么 未知类型的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().....
}
public void DoSomething(对象oc)
{
//我知道“oc”是一个可观察的集合
//如何不用做就可以得到它的类型
//obj.GetType().GetProperties()。。。。。
}

谢谢

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

public static void AddUnknown<T>(this ObservableCollection<T> collection, object item){
      collection.Add((T)item);
}
公共静态void AddUnknown(此ObservableCollection集合,对象项){
集合。添加((T)项);
}
然后可以像collection.AddUnknown(obj)


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

,您可以编写一个扩展方法来完成此操作

public static Type GetGenericType<T>(this ObservableCollection<T> o)
{
    return typeof(T);
}
公共静态类型GetGenericType(此ObservableCollection o)
{
返回类型(T);
}
也请看一下这里:

编辑:

这很有趣:)

我想出了一个使用动态

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);
}
公共静态无效剂量仪(对象o)
{
var iCollection=o作为iCollection;
如果(iCollection!=null)
{
动态oc=iCollection;
类型t=GetGenericType(oc);
//现在你有了你的类型:)
}
}
公共静态类型GetGenericType(列表o)
{
返回类型(T);
}

使用对象有两种方法:

  • 使用反射(您说过这是不可取的)
  • 反复试验
  • 使用足够广泛的基类或接口
试错

尝试所有可能的变化:

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.");

你知道一种简单而优雅的方法可以把字体从收藏中提取出来吗?我试过这样做:`publicstatict GetType(observecollection collection){return T;}`但我得到一个错误,说类型参数名此时无效。这取决于您通过将其取出所需要的内容。一种方法是通过GetGenericTypeArguments(),问题是示例方法接收到一个observablecollection对象。我需要它来接收一个对象类型的对象,它是一个ObservableCollection,但不是显式的…没错,我会删除它。很抱歉。。
 var list = oc as IList;
 list.Add(value);