Возможно ли структурировать общий метод, так что T не является обязательным?
Жесткий вопрос к фразе, но если у меня есть:
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);
}
}
В некоторых случаях я хочу получить объект Bunny без json, потому что строка json имеет значение null, поэтому мне все равно, что T.
В этом случае я могу создать перегрузку или что-то, чтобы полностью игнорировать T
, или я могу вызвать GetBunny<null>
или GetBunny<object>
?
Мне интересно, как правильно решить эту проблему.
Ответы
Ответ 1
У вас может быть не общий класс кролика, который наследует родовой.
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);
}
}
Ответ 2
Вы всегда можете создать неосновный базовый класс
public class Bunny
{
}
public class Bunny<T> : Bunny
{
}
Ответ 3
Во-первых, если класс является общим, то все члены считаются общими, не требуется общий параметр - даже конструктор.
Во-вторых, если вы не заботитесь о T
, вы можете сделать перегрузку GetBunny
withuot T
, так как допускается перегрузка классов и методов на основе разных общих параметров (см., например, Tuple
.)
Самый простой метод, который я нашел для генериков без параметров, заключается в создании неродного базового класса (abstract class Bunny
), из которого наследуется generic (таким образом, Bunny<T> : Bunny
), что упрощает сохранение, скажем, List<Bunny>
разрозненных типы. Это особенно применимо в вашем случае, поскольку базовый класс будет менее конкретной реализацией и, таким образом, будет соответствовать обычному шаблону для наследования.