Инициализировать класс доставки по базовому классу по параметру? - PullRequest
0 голосов
/ 16 октября 2018

У меня есть такой класс:

public class BaseClass
{
    public int Id { get; set; }
    public void MethodOfBase(){}
}
public class Deliver1 : BaseClass
{
    public string Name { get; set; }
}
public class Deliver2 : BaseClass
{
    public string ClassName { get; set; }
}
public class Deliver3 : BaseClass
{
    public int Age { get; set; }
}

У меня есть код:

    public void Method1()
    {
        Deliver1 deliver1 = null;
        MethodWithBaseClass(deliver1);

        Deliver2 deliver2 = null;
        MethodWithBaseClass(deliver2);

        Deliver3 deliver3 = new Deliver3();
        MethodWithBaseClass(deliver3);


    }

    public void MethodWithBaseClass(BaseClass baseClass)
    {
        if(baseClass == null)
            baseClass = ???
    }

Я хочу инициализировать доставку, но я не хочу проверять вот так:

    public void MethodWithBaseClass(BaseClass baseClass)
    {
        if (baseClass == null && baseClass is Deliver1)
            baseClass = new Deliver1();
        else if.....
    }

Потому что это слишком много, если проверка.Является ли это возможным?И как это сделать?

Спасибо большое!

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Кажется, вы просто используете переданный экземпляр, чтобы получить его тип и создать новый экземпляр этого типа.Мне это кажется странным.

Кроме того, вы смешиваете две вещи: инициализация предполагает, что вы уже создали экземпляр , как в вашем текущем коде.Вы можете передать этот экземпляр в ваш метод и изменить его свойства или поля, но вы не можете изменить этот экземпляр (если вы не используете ref -ключевое слово).Вместо этого вы, похоже, хотите передать тип методу и позволить этому методу создать новый экземпляр этого типа.

public BaseClass MethodWithBaseClass(Type baseClass)
{
    return (BaseClass) Activator.CreateInstance(baseClass);
}

Теперь назовите это так:

var newInstance = MethodWithBaseClass(typeof(Derived1));

Это, конечно, выкинет InvalidCastException, если вы предоставите тип, который не наследуется от BaseClass.Это означает, что вы теряете строгую типизацию, то есть вы не знаете, когда compile - точный тип, полученный из метода.Вы также можете сделать метод универсальным:

public T MethodWithBaseClass<T>() where T: BaseClass, new()
{
    return new T();
}

и вызвать его так:

var newInstance = MethodWithBaseClass<Derived1>();

Это позволяет строго печатать, но предполагает, что вы знаете точный тип во время компиляции.

0 голосов
/ 16 октября 2018

Это невозможно с кодом, который вы написали, так как if (baseClass == null && baseClass is Deliver1) всегда будет возвращать false.Это связано с тем, что проверка типа по ссылке null не работает (проверяется значение, а не тип резервной переменной).

В этом случае вы должны использовать обобщенные значения (и ref),но я не думаю, что это особенно хороший дизайн:

public void MethodWithBaseClass<T>(ref T instance) where T : new()
{
    if (instance == null)
    {
        instance = new T();
    }
}

Использование:

Deliver1 deliver1 = null;
MethodWithBaseClass(ref deliver1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...