难以解释的问题,但如果我有:
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>
?
我想知道解决这个问题的正确方法是什么。
答案 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}}。这特别适用于您的情况,因为基类是一个不太具体的实现,因此符合通常的继承模式。