A melhor maneira de determinar como converter um objeto em um tipo apropriado em C#?

StackOverflow https://stackoverflow.com/questions/209354

  •  03-07-2019
  •  | 
  •  

Pergunta

Atualmente estou desenvolvendo um serviço WCF de roteamento de aprovação que permitirá que um usuário crie "regras" que determinam como uma solicitação é roteada.A rota é determinada comparando a propriedade "ObjectToEvaluate" da classe Request com a propriedade "ObjectToEvaluate" da classe "Rule".A enumeração "UnitOfMeasurement" determina como converter a propriedade "ObjectToEvaluate" para cada classe.

public enum UnitOfMeasurement
{
    Currency = 1,
    Numeric = 2,
    Special = 3,
    Text = 4,
}

public class Request
{
    public object ObjectToEvaluate { get; set; }
}

public class Rule
{
    public object ObjectToEvaluate { get; set; }

    public virtual void ExecuteRule()
    {
        //logic to see if it passes the rule condition
    }
}

Qual seria a melhor maneira de implementar o método para converter a propriedade "ObjectToEvaluate" usando o enum "UnitOfMeasurement"?

Foi útil?

Solução

Use um operador de tipo implícito que verifique o valor da enumeração. Dessa forma, os chamadores podem atribuir transparentemente os objetos aos tipos que você deseja representá -los. Por exemplo:

public class CastableObject {

    private UnitOfMeasurement eUnit; // Assign this somehow

    public static implicit operator int(CastableObject obj) 
    {
        if (obj.eUnit != UnitOfMeasurement.Numeric)
        {
            throw new InvalidCastException("Mismatched unit of measurement");
        }
        // return the numeric value
    }

    // Create other cast operators for the other unit types
}

Outras dicas

De onde você está tirando a unidade de medida?Posso ver o enum, mas não vejo nenhuma referência a ele em nenhum outro lugar da API.

Supondo que você o obtenha de algum lugar, a solução mais fácil pode ser uma instrução switch.É um pouco feio, mas:

  • Vai funcionar
  • É fácil de entender
  • Será rápido

Ainda não estou totalmente convencido de que entendi tudo sobre a questão - principalmente porque você não explicou para que os outros objetos serão usados ​​​​após a conversão.

A unidade de medição enum está contida no serviço de roteamento de aprovação. Para elaborar mais sobre a classe de regra, é usada como uma classe base para todos os outros tipos de regras. É vagamente baseado no mecanismo de fluxo do mecanismo de regras de negócios nxbre Página inicial do nxbre.

Aqui está um exemplo da classe LessThanRule (modifiquei a pergunta original para refletir a funcionalidade correta):

public class LessThanRule : Rule
{
    private bool m_Result = false;
    private object m_ObjectToCompare = null;
    private object m_ObjectToEvaluate = null;

    public bool Result
    {
        get { return this.m_Result; }
    }

    public object ObjectToCompare
    {
        get { return this.m_ObjectToCompare; }
        set { this.m_ObjectToCompare = value; }
    }

    public object ObjectToEvaluate
    {
        get { return this.m_ObjectToEvaluate; }
        set { this.m_ObjectToEvaluate = value; }
    }

    public override void ExecuteRule()
    {
        if (((IComparable)this.m_ObjectToEvaluate).CompareTo(this.m_ObjectToCompare) < 0)
            this.m_Result = true;
    }
}

Espero que isto ajude....

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top