将KeyValuePair转换为接口

时间:2013-01-14 21:50:37

标签: c# list casting

我遇到了InvalidCastException尝试施放

的问题
IList<KeyValuePair<string, object>> x

IList<IItem> y

其中IItem是我的界面 我试过......

IList<IItem> y = (IItem) x; //INVALIDCASTEXCEPTION

IList<IItem> y = x.Cast<IItem>().ToList(); //another exception

......有人可以帮助我吗?

3 个答案:

答案 0 :(得分:2)

无法将KeyValuePar<string,object>投放到您的界面。您需要创建实现它的类的实例,然后您可以将其强制转换为接口类型。

假设这是你的界面和实现它的类:

interface IItem
{
    string Prop1 { get; set; }
    object Prop2 { get; set; }
}

class SomeClass : IItem
{
    public string Prop1
    {
        get;
        set;
    }

    public object Prop2
    {
        get;
        set;
    }
}

现在,您可以从IList<IItem>

创建List<KeyValuePar<string,object>>
IList<KeyValuePair<string, object>> xList = ...;
IList<IItem> y = xList
    .Select(x => (IItem)new SomeClass { Prop1 = x.Key, Prop2 = x.Value })
    .ToList();

答案 1 :(得分:1)

KeyValuePair<TKey, TValue>未实现IItem,它似乎甚至不是.NET Framework的一部分。除非你在某个地方重新定义KeyValuePair,否则你无法施放它。

编辑:即使您已定义了界面,也无法将IList<YourKeyValuePair>投射到IList<IItem>,因为IList不是协变的。但是,您可以将其投射到IEnumerable<IItem>

答案 2 :(得分:-1)

您可以使用explicit keywordimplicit keyword

自行定义演员IItem