InvalidCastException:无法将通用List转换为对象

时间:2016-07-07 12:14:28

标签: c# casting generic-list

有人可以向我解释为什么以下演员表不起作用以及解决问题的方法。

我有AbstractKafkaAvroDeserializer

GroupedResult

我想将public class GroupedResult<TKey, TElement> { public TKey Key { get; set; } private readonly IEnumerable<TElement> source; public GroupedResult(TKey key, IEnumerable<TElement> source) { this.source = source; this.Key = key; } } public class Bacon { } 投射到List<string, Bacon>。我尝试了以下和其他方式。

List<string, object>

但我总是收到以下错误:

  

InvalidCastException:无法转换类型&#39; GroupedResult var list = new List<GroupedResult<string, Bacon>> { new GroupedResult<string, Bacon>("1", new List<Bacon>()), new GroupedResult<string, Bacon>("2", new List<Bacon>()) }; var result = list.Cast<GroupedResult<string, object>>().ToList(); 2 [System.String,System.Object]&#39;的对象。

4 个答案:

答案 0 :(得分:1)

为此,你必须使用界面而不是类型。

public interface IGroupResult<TKey, out TElement>
{
    TKey Key { get; set; }
}

public class GroupedResult<TKey, TElement> : IGroupResult<TKey, TElement>
{
    public TKey Key { get; set; }

    private readonly IEnumerable<TElement> source;

    public GroupedResult(TKey key, IEnumerable<TElement> source)
    {
        this.source = source;
        this.Key = key;
    }
}

public class Bacon
{

}

然后你可以做类似

的事情
IGroupResult<string, Bacon> g = new GroupedResult<string, Bacon>("1", new List<Bacon>());

var result = (IGroupResult<string, object>)g;

这是因为只有接口和委托才允许协方差,而不允许类。请注意,如果类型仅来自接口(方法返回类型和只读属性),则应仅将类型标记为共变量。

虽然您应该问自己为什么要在使用泛型时向object投射内容。泛型的要点是避免使用object类型作为全部捕获,这可能表明您的设计中存在一个您可能想要重新考虑的缺陷。

答案 1 :(得分:0)

最好从GroupedResult开始&lt; string,object&gt;然后你可以这样做

new GroupedResult<string, object>("2", new List<Bacon>())

答案 2 :(得分:0)

为什么您使用GroupedResult<string, object>代替GroupedResult<string, Bacon>?像这样:

var list = new List<GroupedResult<string, object>>
    {
        new GroupedResult<string, object>("1", new List<Bacon>()),
        new GroupedResult<string, object>("2", new List<Bacon>())
    };

答案 3 :(得分:0)

您可以在Cast课程中使用GroupedResult方法并使用它进行投射!

public class GroupedResult<TKey, TElement>
{
    public TKey Key { get; set; }

    private readonly IEnumerable<TElement> source;

    public GroupedResult(TKey key, IEnumerable<TElement> source)
    {
        this.source = source;
        this.Key = key;
    }

    public GroupedResult<TKey, object> Cast()
    {
        return new GroupedResult<TKey, object>(Key, source.Cast<object>());
    }
}

public class Bacon
{ 
}

static void Main(string[] args)
{

   var list = new List<GroupedResult<string, Bacon>>
   {
        new GroupedResult<string, Bacon>("1", new List<Bacon>()),
        new GroupedResult<string, Bacon>("2", new List<Bacon>())
    };

    // var result = list.Cast<GroupedResult<string, object>>().ToList();
    List<GroupedResult<string,object>> result = list.Select(B => B.Cast()).ToList();
}