从枚举到泛型

时间:2017-09-11 08:18:10

标签: c# generics

我有两个这样的课程

public class excel: document{

}

public class pdf: document{

}

和基类文档。

我有一个枚举

public enum DocumentType{
    excel = 1,
    pdf = 2
}

我有一个带有泛型方法实现方法的核心类

public class manager{

    LoadFile<T> (Stream stream) where T: document{
    ...
    }

}

我可以用这样的命令调用loadfile方法吗

Type GetType(DocumentType documentType){
    ...
}

LoadFile<GetType(DocumentType.excel)>(myStream){
    ...
}

我希望枚举创建一个通用参数。

错误是

  

&LT; generic不能应用于类型&#39;方法组&#39;

的操作数

1 个答案:

答案 0 :(得分:0)

如果您在编译时知道类型,例如&#34;请加载此pdf,它肯定会是一个pdf&#34; - 然后我根本没有理由去看仿制药。你只是在用流数据实例化对象并让它自己构建时,你不会自己保存。

// for example
class pdf : document {
    public pdf(Stream stream)
    {
         // load the pdf data from the stream here
    }
}

对于您不了解对象类型的情况,&#34;加载用户选择的文件,它可能是pdf,可能是excel文件&#34;,您也不会...我想要担心泛型。相反,您需要一个返回基本文档类型的函数 - 因为您在加载之前不知道它是什么类型(即在编译时,您不知道 - 所以您不能使用泛型):

document LoadFromStream(Stream stream)
{
    var typeOfDocument = SomeMethodToFindTheFileTypeFromTheStream(stream);
    switch(typeOfDocument)
    {
        case DocumentType.pdf:
            return LoadPDFFromStream(stream);  // returns pdf object
        case DocumentType.excel:
            return LoadExcelFromStream(stream);  // returns an excel object
        default:
            throw new Exception("Document is not a supported type");
    }
}

如果您需要特定对象,则需要使用对象内的信息(例如文档类型枚举)向下转换它,以确定将其强制转换为哪种类型。

我担心没有银弹通用的解决方案。如果您在编译时知道文件类型,泛型并不能保存任何内容。如果你没有 - 你需要一些条件逻辑来确定它实际是什么类型(无论是在加载之前还是之后,例如使用文件扩展名来决定)。

泛型无法为您节省时间或让您的生活更轻松。