c# 如何 return a class 在工厂方法中指定泛型 class

c# How to return a class that specify a generic class in factory method

我想知道是否可以使用这种方法而不用在 return 上进行那种丑陋的转换?

    public static AbstractFileReader<T> GetReader<T>(string filename, T data)
    {
        if(data is string)
        {
            return GetTextFileReader(filename) as AbstractFileReader<T>;
        }
        else if(data is byte[])
        {
            return GetBytesFileReader(filename) as AbstractFileReader<T>;
        }
        else
        {
            Debug.LogError("There is no reader for that type of data : " + data.GetType().ToString());
            return null;
        }
    }

为简单起见,这是我的架构:

> AbstractFileReader<T> => The generic base class
> AbstractTextFileReader : AbstractFileReader<string> => an abstract class
> StandaloneTextFileReader : AbstractTextFileReader => the final implementation

我的第一个想法是做一个像这样的方法:

    public static AbstractFileReader<T> GetReader<T>(string filename, T data)
    {
        if(data is string)
        {
            return StandaloneTextFileReader(filename);
        }
        else if(data is byte[])
        {
            return StandaloneBytesFileReader(filename);
        }
        else
        {
            Debug.LogError("There is no reader for that type of data : " + data.GetType().ToString());
            return null;
        }
    }

但我的编译器似乎不接受它。有什么办法可以实现吗? 谢谢

泛型在这里没有给你任何好处。

您目前使用 T 的全部目的是指定其中一个参数的类型(除了查询其类型外,您甚至不使用它)。您可以像 AbstractFileReader GetReader(string filename, Object data).

一样轻松地编写它

泛型的全部意义在于不关心类型是什么(尽管您可以对其施加限制)以及泛型class公开的所有方法无论类型 T 是什么(例如,Lists),操作方式都相同。

这里不是这种情况。

因此,您根本不应该在这里使用泛型。只需在某处使用 GetReaderForStringGetReaderForBytes 方法,并根据需要 return 使用 StandaloneTextFileReaderStandaloneBytesFileReader (或者完全放弃这些方法,只使用 new 合适的 class).