使用“通用值”将对象强制转换为KeyValuePair?

时间:2015-09-25 12:06:20

标签: c# casting keyvaluepair

我有一个ComboBox,里面装满了两种不同类型的混合物品。类型是

KeyValuePair<Int32, FontFamily>

KeyValuePair<Int32, String>

现在有些时候我只对所选项目的Key感兴趣,它始终是Int32。

访问所选项目的密钥最简单的方法是什么?我在考虑像

这样的东西
Int32 key = ((KeyValuepair<Int32, object/T/var/IdontCare>)combobox.SelectedItem).Key;

但这不起作用。

所以我只有

    Int32 key;
    if(combobox.SelectedItem.GetType().Equals(typeof(KeyValuePair<Int32, FontFamily)))
    {
        key = ((KeyValuePair<Int32, FontFamily)combobox.SelectedItem).Key;
    }
    else if(combobox.SelectedItem.GetType().Equals(typeof(KeyValuePair<Int32, String)))
    {
        key = ((KeyValuePair<Int32, String)combobox.SelectedItem).Key;
    }

哪个有效,但我想知道是否有更优雅的方式?

4 个答案:

答案 0 :(得分:6)

施放到dynamic(穷人的反思)可以做到这一点

var key = (int) ((dynamic) comboxbox.SelectedItem).Key);

答案 1 :(得分:3)

您当然不需要使用GetType()。你可以使用:

int key;
var item = combobox.SelectedItem;
if (item is KeyValuePair<int, FontFamily>)
{
    key = ((KeyValuePair<int, FontFamily>) item).Key;
}
else if (item is KeyValuePair<int, string>)
{
    key = ((KeyValuePair<int, string>) item).Key;
}

如果不使用反射或动态类型,我认为这不是更好的方法,假设您无法将所选项目的类型更改为您自己的等同于KeyValuePair使用一些非泛型基类型或接口。

答案 2 :(得分:3)

我猜它在WPF中受到限制,在这种情况下我建议不要使用KeyValuePair<TKey,TValue>而是使用自己的VM类。 E.g。

class MyComboItem
{
    private String _stringValue;
    private FontFamiliy _fontFamilyValue;

    public Int32 Key {get;set;}
    public object Value => (_fontFamilyValue!=null)?_fontFamilyValue:_stringValue;
}

或者你可以有一个像

这样的界面
interface IMyComboItem
{
    Int32 Key {get;}
    object Value {get;}
}

并实现两个实现它的VM类,存储正确的值类型。 有适当的构造函数等。无法通过泛型来实现您想要实现的转换,并且您的解决方案案例并不优雅。

答案 3 :(得分:2)

您可以像这样创建自己的类层次结构

public interface IComboBoxItem
{
    public int Key { get; }
}

public class ComboBoxItem<T> : IComboBoxItem
{
    public T Value { get; set; }

    public int Key { get; set; }
}

并且您的演员将如下所示:

key = ((IComboBoxItem)combobox.SelectedItem).Key;