使用泛型时初始化类

时间:2010-02-02 14:52:04

标签: c# .net

我有一个Document类,它有两个重载,每个重载一个参数(String和Stream)。为什么我不能使用以下代码使用泛型初始化Document类?

    public abstract class PdfDocumentEditBaseService<T> : IDocumentEditService<T>

    public T Rotate(T file, int pageNumber, float angle)
    {
        Document document = new Document(file); // cannot convert from 'T' to 'Stream'
        document.Pages[pageNumber].Rotation = (RotationMode)angle;
        document.SavePage(pageNumber);
        return file;
    }

4 个答案:

答案 0 :(得分:3)

如果您将声明更改为:

,则可以这样做
public abstract class PdfDocumentEditBaseService<T> : IDocumentEditService<T> where T : Stream

答案 1 :(得分:2)

您需要在班级声明中添加type constraint

public abstract class PdfDocumentEditBaseService<T> : IDocumentEditService<T>
                                            where T : Stream

答案 2 :(得分:1)

我看到一些建议要求T继承Stream。这将有效。但是,如果你的T确实总是一个流,为什么不删除泛型参数并构建这样的类:

public abstract class PdfDocumentEditBaseService : IDocumentEditService
{
    public Stream Rotate(Stream file, int pageNumber, float angle)
    {
        Document document = new Document(file); 
        document.Pages[pageNumber].Rotation = (RotationMode)angle;
        document.SavePage(pageNumber);
        return file;
    }

答案 3 :(得分:0)

问题似乎是Document类的构造函数需要一个Stream或Stream派生的参数。在编写代码时,无法保证T将成为Stream。

如果在类声明中添加类型约束,则应该起作用:

public abstract class PdfDocumentEditBaseService<T> : IDocumentEditService<T> where T : Stream