如果链接-如何删除?

时间:2018-08-27 18:27:51

标签: c# if-statement

我正在做一个有以下情况的应用程序:

我有几个规则(商务舱)

它们都返回客户端代码。它们是单独的类,如果发现客户端代码返回了代码,它们将查找代码反复试验等等。

如何在不调用包含特定业务规则的其他IF或线程IF的类的情况下使用规则?

对于特定的类,我使用了设计模式策略。

EX:主舱

public abstract class Geral
{
    public abstract string retornaCodigo(Arquivo cliente)
    {
        var codigo = "";   // logica  
        return codigo;
    }
}

public class derivada1 : Geral
{
    public override string retornaCodigo(Arquivo cliente)
    {
        var codigo = "";  // logica  
        return codigo;
    }
}

public class derivada2 : Geral
{
    public override string retornaCodigo(Arquivo cliente)
    {
        var codigo = "";    // logica 2 
        return codigo;
    }
}

public class derivada3 : Geral
{
    public override string retornaCodigo(Arquivo cliente)
    {
       var codigo = "";  // logica 3 
       return codigo ;
    }    
}

public class Negocio
{    
    public string Codigo()
    {
        var arquivo = new Arquivo();
        var derivada1 = new derivada1().retornaCodigo(arquivo);

        var derivada2 = new derivada2().retornaCodigo(arquivo);
        var derivada3 = new derivada3().retornaCodigo(arquivo);

        if (derivada1.Equals(null))
            return derivada1;

        if (derivada2.Equals(null))
            return derivada2;

        if (derivada3.Equals(null))
            return derivada3;

        return "";
    }
}

我想要什么,而不必在Business类中使用Ifs进行验证,是否可以找到在任何条件下都可以使用的代码给出了3个类的示例,并且我有超过15个条件并且可以增加,情况可能会很多。

4 个答案:

答案 0 :(得分:0)

您可以创建一个派生列表,然后对其进行迭代

如果给定的任何derivada1等于None,则只需返回它,否则继续执行“ for循环”

如果这对您没有意义,我可以写一个代码段。 lmk!

答案 1 :(得分:0)

这对于Linq来说很简单:

public class Negocio
{

    public string Codigo()
    {
        var arquivo = new Arquivo();

        var derivadaList = new List<Geral>() {
            new derivada1(),
            new derivada2(),
            new derivada3(),
        };

        return derivadaList.FirstOrDefault(d => d.retornaCodigo(arquivo) == null)?.retornaCodigo(arquivo) ?? "";
    }
}

您可以根据需要向Geral添加任意数量的derivadaList派生类,并且代码将继续按设计运行。

这里发生的是FirstOrDefault将在每个元素上运行Lamda表达式,并返回第一个等于null的元素(尽管我不确定这不是您想要的,但它与您的示例匹配码)。由于它返回一个Geral对象,因此仅当它不为null时,才需要对其调用retornaCodigo。如果为空,则返回一个空字符串。

另一种写法是:

public class Negocio
{

    public string Codigo()
    {
        var arquivo = new Arquivo();

        var derivadaList = new List<Geral>() {
            new derivada1(),
            new derivada2(),
            new derivada3(),
        };

        foreach (var derivada in derivadaList)
        {
            var result = derivada.retornaCodigo(arquivo);
            if (result == null)
                return result;
        }

        return "";
    }
}

答案 2 :(得分:0)

让我们将所有derivada组织到一个集合中,例如数组,然后在 Linq < / p>

public string Codigo() {
  var arquivo = new Arquivo(); 

  Geral[] derivadas = new [] {
    new derivada1(),
    new derivada2(),
    new derivada3(); 
  };

  //TODO: check the the condition: I guessed that you want to return first meanful codigo
  foreach (var codigo in derivadas.Select(geral => geral.retornaCodigo(arquivo)))
    if (!string.IsNullOrEmpty(codigo))
      return codigo; 

  return "";
}

如果您有很多derivada,则可以尝试使用 Reflection 来创建集合:

using System.Reflection;

...

private static Geral[] s_Derivadas = AppDomain
  .CurrentDomain
  .GetAssemblies()                                       // scan assemblies 
  .SelectMany(asm => asm.GetTypes())                     // types within them
  .Where(t => !t.IsAbstract)                             // type is not abstract
  .Where(t => typeof(Geral).IsAssignableFrom(t))         // type derived from Geral
  .Where(t => t.GetConstructor(Type.EmptyTypes) != null) // has default constructor
  .Select(t => Activator.CreateInstance(t) as Geral)     // create type's instance
  .ToArray();                                            // materialized as array

然后

public string Codigo() {
  var arquivo = new Arquivo(); 

  foreach (var codigo in s_Derivadas.Select(geral => geral.retornaCodigo(arquivo)))
    if (!string.IsNullOrEmpty(codigo))
      return codigo; 

  return "";
}

答案 3 :(得分:0)

您还可以使用派生类的列表并在循环中调用它们

public string Codigo()
{
    var arquivo = new Arquivo();
    List<Geral> gerals=new List<Geral>();
    gerals.Add(new derivada1());
    gerals.Add(new  derivada2());
     ........
     ...........
   foreach(Geral g in gerals)
   {
     var val=g.retornaCodigo(arquivo);
     if(val!=null)
        return val;
    }
    return "";
}

这是一个示例实现,但是您没有正确使用策略

更好的方法是构造函数注入

public string Codigo(Geral implementar)
{
   var val=geral.retornaCodigo(arquivo);
   return "";
}

然后仅使用所选策略实例化。

否则,如果您要链接多个验证,请使用责任模式CHain。