将Object转换为List <basetype>而不是派生类型</basetype>

时间:2014-10-05 22:37:06

标签: c# wpf binding covariance ivalueconverter

我正在尝试为我的派生类型编写一个通用转换器。

正在返回我的派生类型,即List<DerivedType>

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    string text = string.Empty;
    if (value is List<BaseType>)
    {
        var v = value as List<BaseType>;
        var x = v.Select(c => c.Name);
        text = string.Join(", ", x);
    }

    return text;
}

DerivedType, BaseType are placeholders for classes

value = List<DerivedType>
targetType = string
parameter = null

1 个答案:

答案 0 :(得分:2)

你去吧

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        string text = string.Empty;
        IEnumerable source = value as IEnumerable;
        if (source != null)
        {
            var v = source.OfType<BaseType>();
            var x = v.Select(c => c.Name);
            text = string.Join(", ", x);
        }

        return text;
    }

使用这种方法,我们只需验证该值是否为集合IEnumerable,然后将尝试检索BaseType的所有对象,其余部分保持不变。

另一个更简单的方法,感谢Sergey Brunov

    IEnumerable<BaseType> source = value as IEnumerable<BaseType>;
    if (source != null)
    {
        var x = source.Select(c => c.Name);
        text = string.Join(", ", x);
    }

其他方法可能包括验证通用类型以验证相同。