【问题标题】:Elegant way to get T type from ObservableCollection<T> in .NET 4.0 [duplicate]从 .NET 4.0 中的 ObservableCollection<T> 获取 T 类型的优雅方法 [重复]
【发布时间】:2012-10-24 15:22:02
【问题描述】:

可能重复:
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().....
}

谢谢

【问题讨论】:

  • 那是真的,我会删除它。对不起..

标签: c# types observablecollection


【解决方案1】:

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

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

然后可以像collection.AddUnknown(obj)一样使用

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

【讨论】:

  • 你知道一个简单而优雅的方法来让类型 离开集合吗?我试过这个:` public static T GetType(ObservableCollection collection) { return T; }` 但我收到一条错误消息,提示此时类型参数名称无效。
  • 取决于你把它弄出来的意思。一种方法是通过 GetGenericTypeArguments()
【解决方案2】:

你可以编写一个扩展方法来为你做这件事

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);
}

【讨论】:

  • 这个问题是您的示例方法接收到一个 observablecollection 对象。我需要它来接收对象类型的对象,该对象是 ObservableCollection 但不是明确的......
【解决方案3】:

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

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

反复试验

尝试所有你认为可能的变化:

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

【讨论】:

    猜你喜欢
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    相关资源
    最近更新 更多