0

我在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

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

4

3 回答 3

2

AKeyValuePar<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();
于 2013-01-14T22:01:10.070 回答
1

KeyValuePair<TKey, TValue>没有实现IItem,这似乎甚至不是 .NET Framework 的一部分。你不能施放它,除非你在KeyValuePair某个地方重新定义了。

编辑:即使您定义了接口,也无法转换为IList<YourKeyValuePair>IList<IItem>因为IList它不是协变的。但是,您可以将其转换为IEnumerable<IItem>.

于 2013-01-14T21:53:05.363 回答
-1

您可以使用显式关键字隐式关键字IItem为自己定义强制转换

于 2013-01-14T21:56:23.680 回答