Il modo migliore per determinare come eseguire il cast di un oggetto su un tipo appropriato in C #?

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

  •  03-07-2019
  •  | 
  •  

Domanda

Attualmente sto sviluppando un servizio WCF di routing di approvazione che consentirà a un utente di creare "regole" che determinano come viene instradata una richiesta. Il percorso viene determinato confrontando " ObjectToEvaluate " proprietà della classe Request rispetto a " ObjectToEvaluate " proprietà della "Regola" classe. L '"unità di misura" " enum determina come lanciare " ObjectToEvaluate " proprietà per ogni 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
    }
}

Quale sarebbe il modo migliore per implementare il metodo per lanciare " ObjectToEvaluate " utilizzando la proprietà " UnitOfMeasurement " enum?

È stato utile?

Soluzione

Utilizzare un operatore di tipo implicito che controlla il valore dell'enum. In questo modo i chiamanti possono assegnare in modo trasparente gli oggetti ai tipi che si desidera rappresentarli. Ad esempio:

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
}

Altri suggerimenti

Da dove prendi l'unità di misura? Posso vedere l'enum, ma non vedo alcun riferimento ad esso altrove nell'API.

Supponendo che tu lo ottenga da qualche parte, la soluzione più semplice potrebbe essere un'istruzione switch. È un po 'brutto, ma:

  • Funzionerà
  • È facile da capire
  • Sarà veloce

Non sono ancora del tutto convinto di capire tutto sulla domanda, in particolare perché non hai spiegato a cosa serviranno gli altri oggetti dopo il casting.

L'enum Unit of Measurement è contenuto nel servizio di routing di approvazione. Per elaborare di più sulla classe Rule, viene utilizzata come classe base per tutti gli altri tipi di regole. È vagamente basato sul motore di flusso del motore delle regole aziendali di NxBRE Home page di NxBRE .

Ecco un esempio della classe LessThanRule (ho modificato la domanda originale per riflettere la corretta funzionalità):

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

Spero che questo aiuti ....

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top