Подтвердить что ты не робот

Возможно ли структурировать общий метод, так что 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>?

Мне интересно, как правильно решить эту проблему.

4b9b3361

Ответ 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> разрозненных типы. Это особенно применимо в вашем случае, поскольку базовый класс будет менее конкретной реализацией и, таким образом, будет соответствовать обычному шаблону для наследования.