任何类型的集合

时间:2018-05-31 12:07:32

标签: c# generics collections

我正在开发一个项目,该项目将根据呈现的数据生成Excel文件。 Book类有多个Sheet类,每个Sheet类包含一个对象列表。但是,不同的纸张可能具有不同类型的数据。

即。第一张可能是List<Dog>,第二张可能是List<Planet>

我们的想法是从EF获取不同的结果集,创建新书,为每个结果集添加工作表,然后让应用程序创建Excel文件。

使用泛型(我很陌生)给了我一些问题。

public class Book
{
    public List<Sheet> Sheets { get; set; }
}

public class Sheet
{
    public string Name { get; set; }
    public List<T> Data { get; set; }
}

这不起作用,因为“无法找到T”,所以我改变了表格

public class Sheet<T>
{
    public string Name { get; set; }
    public List<T> Data { get; set; }
}

但是Book需要知道T,这使得我的Sheet列表只有一种类型。

我尝试了接口路由,并将两个属性添加到接口,但是(再次)导致我必须提供T。

public interface ISheet
{
    string Name { get; set; }
    List<T> Data { get; set; }
}

我确信我错过了一些显而易见的东西,而且我太复杂了。

由于

[编辑:在我使用'List<Book>'的一个示例中,但我意识到这很令人困惑,所以我将其更改为'List<Planet>']

1 个答案:

答案 0 :(得分:0)

您必须将Generic与继承相结合,一个简单的解决方案可能是:

self.expressApp.post("/upload", function (req, res) {
        var busboy = new Busboy({ headers: req.headers });
        busboy.on('file', function(fieldname, file, filename, encoding, mimetype) {
            var subchunks = "",
                sub = file.pipe(srt2vtt());
            sub.on('data',function(buffer){
                subchunks += buffer.toString('utf8');
            });
            sub.on('end',function(){
                socket.emit('Subtitles',subchunks);
            });
        });
        busboy.on('finish', function() {
            res.writeHead(200, { 'Connection': 'close' });
            res.end();
        });
        return req.pipe(busboy);
});

当然,您必须使用至少一个知道要创建的工作表类型的工厂方法,并且看起来像:

var subobj = new Blob([new Uint8Array(payload)],{type: "text/vtt"}),
    url = (URL || webkitURL).createObjectURL(subobj),
    track = document.createElement("track");                
track.kind = "captions";
track.label = "English";
track.srclang = "en";
track.src = url;
videoElement.append(track);
track.mode = "showing";
videoElement.textTracks[0].mode = "showing";

我认为这很有效。 如果它对您有用,请告诉我。 再见