【问题标题】:IValueConverter - Casting generic CollectionsIValueConverter - 铸造通用集合
【发布时间】:2014-01-05 17:24:41
【问题描述】:

我想创建一个独立于类型的转换器,用于计算具有泛型类型的集合中的元素。

    public class CollectionCountConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return ((SomeCastingType)value).Count;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException(); // not used for oneway binding
    }
}
在这种情况下,

value 是任何类型的 Collection。问题是找到正确的铸造类型并铸造对象。我想要的是类似的东西

Type t = value.GetType();
ICollection<t> c = (ICollection<t>) value;
int count = c.Count();

但这不起作用。我也尝试将 Object 用作​​泛型类型,但随后我得到了 InvalidCastException。有什么优雅的方法吗?

【问题讨论】:

  • 这里涉及的实际类型是什么?大多数集合也实现了非泛型 ICollection 接口,这让事情变得更简单......你能用它来代替吗?
  • 你也可以使用IEnumerable&lt;object&gt;。这是声明Count() 的地方。
  • 列表的实际类型是 List 并且它正在使用 ICollection 接口转换!抱歉,我是 C# 新手...

标签: c# generics collections casting ivalueconverter


【解决方案1】:

由于IEnumerable&lt;T&gt; 是协变的,你可以使用它。

return ((System.Collections.Generic.IEnumerable<object>)value).Count();

来自MSDN

类型参数

出来了

要枚举的对象的类型。

这个类型参数是协变的。也就是说,您可以使用任一类型 您指定的或任何更派生的类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-28
    • 1970-01-01
    • 2012-09-03
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多