¿La mejor manera de determinar cómo lanzar un objeto a un tipo apropiado en C #?

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

  •  03-07-2019
  •  | 
  •  

Pregunta

Actualmente estoy desarrollando un servicio WCF de enrutamiento de aprobación que permitirá a un usuario crear " reglas " que determinan cómo se enruta una solicitud. La ruta se determina mediante la comparación de " ObjectToEvaluate " propiedad de la clase Request contra el " ObjectToEvaluate " propiedad de la "Regla" clase. La " UnitOfMeasurement " enumeración determina cómo emitir el " ObjectToEvaluate " propiedad para cada clase.

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
    }
}

¿Cuál sería la mejor manera de implementar el método para emitir " ObjectToEvaluate " propiedad utilizando la " UnitOfMeasurement " enum?

¿Fue útil?

Solución

Utilice un operador de tipo implícito que verifique el valor de la enumeración. De esa manera, las personas que llaman pueden asignar de forma transparente los objetos a los tipos que desea representarlos. Por ejemplo:

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
}

Otros consejos

¿De dónde obtiene la unidad de medida? Puedo ver la enumeración, pero no veo ninguna referencia a ella en ninguna otra parte de la API.

Suponiendo que lo obtenga de alguna parte, la solución más fácil puede ser una declaración de cambio. Es un poco feo, pero:

  • Funcionará
  • Es fácil de entender
  • Será rápido

Todavía no estoy completamente convencido de que entiendo todo acerca de la pregunta, particularmente porque no has explicado para qué se usarán los otros objetos después del lanzamiento.

La enumeración de la Unidad de medida se encuentra dentro del servicio de enrutamiento de aprobación. Para elaborar más sobre la clase Regla, se utiliza como una clase base para todos los demás tipos de reglas. Se basa libremente en el motor de flujo del motor de reglas de negocio NxBRE Página de inicio de NxBRE .

Aquí hay un ejemplo de la clase LessThanRule (modifiqué la pregunta original para reflejar la funcionalidad correcta):

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 esto ayude ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top