【问题标题】:List with Multiple Generic Objects (Covariance Issue)具有多个通用对象的列表(协方差问题)
【发布时间】:2020-01-06 23:16:03
【问题描述】:

我一直在努力解决这个问题,并查看了类似的问题,但在这里没有得到正确的解决方案。

我正在使用通用类来保存导出配置

public class SpreadsheetConfiguration<T> where T : class 
{
    public IEnumerable<T> ExportData {get; set;}
    // More stuff here
}

我有一种情况,我需要这些列表,可能不是同一类型,例如这样

public byte[] ExportMultipleSheets(IEnumerable<SpreadsheetConfiguration<object>> toExport)

但我一辈子都无法弄清楚如何完成这项工作,我已经查看了上面关于制作 ISpreadsehetConfiguration 或其他方式的其他路线。

这是一个开源项目:https://github.com/IowaComputerGurus/netcore.utilities.spreadsheet

我知道我遗漏了一些东西,但我已经尝试了以上所有方法,但仍然没有达到我仍然可以做的最终用法

var toExport = new SpreadsheetConfiguration<MyOtherClass>();

因为转换失败

【问题讨论】:

    标签: c# .net generics covariance


    【解决方案1】:

    如果你的类应该在 IEnumerable&lt;T&gt; 上有一个 setter,那么它不能是协变的。协变是只读的,逆变是只写的。如果你既需要又需要一组这样的配置,那么你的设计就有缺陷。

    如果您愿意对该属性仅拥有get 访问权限,那么您首先需要为您的类创建一个接口,因为差异仅适用于通用接口:

    public interface ISpreadsheetConfiguration<out T> where T : class
    {
        IEnumerable<T> ExportData { get; }
    }
    
    public class SpreadsheetConfiguration<T> : ISpreadsheetConfiguration<T> where T : class
    {
        public IEnumerable<T> ExportData {get; set;}
    }
    

    注意接口类型参数声明中的 out 关键字 - 这意味着 ISpreadsheetConfiguration&lt;T&gt;T 中是协变的。

    现在你可以这样做了:

    public byte[] ExportMultipleSheets(IEnumerable<ISpreadsheetConfiguration<object>> toExport);
    
    
    var toExport = new ISpreadsheetConfiguration<object>[]
    {
        new SpreadsheetConfiguration<MyOtherClass>(),
        new SpreadsheetConfiguration<CompletelyDifferentClass>()
    };
    
    ExportMultipleSheets(toExport);
    

    更多关于方差以及为什么协方差不能与类型为There 的同时允许读写的类型一起使用。

    【讨论】:

    • 非常感谢,我已经尝试过了,这是一个愚蠢的拼写错误问题。在具体的类上,我把 where T : class BEFORE 放在了接口之前,所有的地狱都被打破了.....
    猜你喜欢
    • 1970-01-01
    • 2013-01-23
    • 2018-07-05
    • 1970-01-01
    • 2019-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多