C# Условно назначить тип значения переменной - PullRequest
0 голосов
/ 26 марта 2020

Мне нужно знать, есть ли лучший способ написать этот код. В SomeMethod() ниже я sh верну тип IMyInterface, но возвращаемый объект может быть создан как Class1 или Class2 на основе условия. Class2 имеет дополнительное свойство, которое имеет смысл, только если условие ложно.

public interface IMyInterface
{
    int Prop1 { get; set; }

    string Prop2{ get; set; }
}

public class Class1: IMyInterface
{
    public int Prop1 { get; set; }

    public string Prop2{ get; set; }
}

public class Class2: IMyInterface
{
    public int Prop1 { get; set; }

    public string Prop2{ get; set; }

    public string AdditionalProp{ get; set; }
}

public class SomeClass
{ 
  public IMyInterface SomeMethod(bool cond)
  {
      IMyInterface foo;
      if (cond)
      {
         foo = new Class1();
      }
      else    
      {
         foo = new Class2();
      }
       foo.Prop1 = 1;
       foo.Prop1 = "1";

       if (!cond)
       {
           foo.AdditionalProp = "2";
       }
    }
}

Ответы [ 3 ]

0 голосов
/ 26 марта 2020

Звучит как фабричный шаблон . Единственная разница между вашим кодом и кодом в связанном примере заключается в том, что в вашем случае параметром метода get фабрики будет bool, а не type. Вот как это будет выглядеть:

public interface IMyInterface
{
    int Prop1 { get; set; }

    string Prop2{ get; set; }
}

public class Class1: IMyInterface
{
    public int Prop1 { get; set; }

    public string Prop2{ get; set; }
}

public class Class2: IMyInterface
{
    public int Prop1 { get; set; }

    public string Prop2{ get; set; }

    public string AdditionalProp{ get; set; }
}

/// <summary>
/// Implementation of Factory - Used to create objects
/// </summary>
public class Factory
{
    public IMyInterface GetClass(bool condition)
    {
        if (condition)
        {
            return new Class1();
        }
        else
        {
            return new Class2();
        }
    }
}
0 голосов
/ 26 марта 2020

Вот элегантное решение:

public IMyInterface SomeMethod(bool cond)
{
    return cond
        ? (IMyInterface) new Class1 { Prop1 = 1, Prop2 = "1" }
        : new Class2 { Prop1 = 1, Prop2 = "1", AdditionalProp = "2" };
}
0 голосов
/ 26 марта 2020

Если я правильно понимаю ваше требование, следующий подход решит вашу проблему.

Вы можете inlineize объекты inline:

public IMyInterface SomeMethod(bool cond)
{

    IMyInterface foo;
    if (cond)
    {
        foo = new Class1();
    }
    else
    {
        foo = new Class2() { AdditionalProp = "2" };
    }

    foo.Prop1 = 1;
    foo.Prop2 = "1";

    return foo;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...