c# 如何返回一个在工厂方法中指定泛型类的类

我想知道是否可以执行这样的方法,而不会在返回时进行丑陋的转换?


    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;

        }

    }

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


犯罪嫌疑人X
浏览 35回答 1
1回答

元芳怎么了

泛型在这里对你没有任何帮助。T您目前所使用的只是指定其中一个参数的类型(除了查询其类型之外,您甚至不使用该参数)。您可以像这样轻松地编写它AbstractFileReader GetReader(string filename, Object data)。泛型的全部要点是不关心Type 是什么(尽管您可以对其进行限制),并且无论 TypeT是什么(例如Lists),泛型类公开的所有方法都以相同的方式运行。这里的情况并非如此。因此,您根本不应该在这里使用泛型。只需在某处有一个GetReaderForStringandGetReaderForBytes方法,并根据需要返回 aStandaloneTextFileReader或StandaloneBytesFileReader(或者完全放弃这些方法,只返回new适当的类)。
打开App,查看更多内容
随时随地看视频慕课网APP