是否可以构造泛型方法,因此T是可选的?

时间:2015-04-10 14:33:10

标签: c# generics

难以解释的问题,但如果我有:

public class BunnyManager
{
    public Bunny<T> GetBunny<T>(string someJson)
    {
       return new Bunny<T>(someJson);
    }
}

public class Bunny<T>
{
   T parsedJson { get; set; }

    public Bunny<T>(string someJson)
    {
        if (!string.IsNullOrEmpty(someJson))
            parsedJson = ConvertJsonStringToObject<T>(someJson);
    }
}

在某些情况下我想得到一个没有任何json的Bunny对象,因为json字符串为null,所以我不在乎T是什么。

在这种情况下,我可以创建一个重载或完全忽略T的内容,还是可以调用GetBunny<null>GetBunny<object>

我想知道解决这个问题的正确方法是什么。

3 个答案:

答案 0 :(得分:20)

你可以拥有一个非泛型的兔子类,通用的类继承自。

public class BunnyManager
{
    public Bunny<T> GetBunny<T>(string someJson)
    {
       return new Bunny<T>(someJson);
    }

    public Bunny GetBunny()
    {
       return new Bunny();
    }
}

public class Bunny
{

}

public class Bunny<T> : Bunny
{
   T parsedJson { get; set; }

    public Bunny(string someJson)
    {
        if (!string.IsNullOrEmpty(someJson))
            parsedJson = ConvertJsonStringToObject<T>(someJson);
    }
}

答案 1 :(得分:4)

您始终可以创建非通用基类

public class Bunny 
{
}

public class Bunny<T> : Bunny
{
}

答案 2 :(得分:2)

首先,如果类是通用的,那么所有成员都是通用的,不需要泛型参数 - 甚至不是构造函数。

其次,如果您不关心T,那么您可以使用GetBunny重载T,因为允许基于不同通用参数重载类和方法(例如,参见Tuple类。)

我找到的没有参数的泛型的最简单的方法是创建一个非泛型基类(abstract class Bunny),泛型继承(因此Bunny<T> : Bunny),这使得它更容易保留,比如说{不同类型的{1}}。这特别适用于您的情况,因为基类是一个不太具体的实现,因此符合通常的继承模式。