【问题标题】:Cast KeyValuePair to Interface将 KeyValuePair 转换为接口
【发布时间】:2012-12-28 22:35:22
【问题描述】:

我遇到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

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

【问题讨论】:

  • 什么是“另一个例外”?从来没有听说过。你还应该展示你的接口和一个实现它的类。
  • IItem 是什么类型?你能给出定义吗?
  • KeyValuePair 不是 IItem,你希望你的演员做什么?

标签: c# list casting


【解决方案1】:

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

假设这是你的接口和一个实现它的类:

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

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

    public object Prop2
    {
        get;
        set;
    }
}

现在您可以从您的List&lt;KeyValuePar&lt;string,object&gt;&gt; 创建一个IList&lt;IItem&gt;

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

【讨论】:

    【解决方案2】:

    KeyValuePair&lt;TKey, TValue&gt; 没有实现IItem,这似乎甚至不是 .NET Framework 的一部分。你不能转换它,除非你在某个地方重新定义了KeyValuePair

    编辑:即使定义了接口,也不能将 IList&lt;YourKeyValuePair&gt; 转换为 IList&lt;IItem&gt;,因为 IList 不是协变的。但是,您可以将其转换为 IEnumerable&lt;IItem&gt;

    【讨论】:

      【解决方案3】:

      您可以使用explicit keywordimplicit keyword 自己定义对IItem 的强制转换

      【讨论】:

      猜你喜欢
      • 2021-06-05
      • 1970-01-01
      • 2011-06-01
      • 2019-09-17
      • 1970-01-01
      • 2012-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多