Bester Weg, um zu bestimmen, wie ein Objekt in C#einen geeigneten Typ in C#wirft?

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

  •  03-07-2019
  •  | 
  •  

Frage

Ich entwickle derzeit einen Genehmigungsrouting -WCF -Dienst, mit dem ein Benutzer "Regeln" erstellt, die feststellen, wie eine Anfrage weitergeleitet wird. Die Route wird durch Vergleich der Eigenschaft "Objectto Evaluate" der Antragsklasse mit der Eigenschaft "Objectto Evaluate" der "Regel" -Klasse ermittelt. Die "UnitofMeasurement" Enum bestimmt, wie die Eigenschaft "Objectto -Evaluate" für jede Klasse gegossen werden kann.

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

Was wäre der beste Weg, um die Methode zu implementieren, um die Eigenschaft "Objectto -Evaluate" mithilfe der "UnitofMeasurement" -Eumum aufzusetzen?

War es hilfreich?

Lösung

Verwenden Sie einen impliziten Typbetreiber, der den Wert der Aufzählung überprüft. Auf diese Weise können Anrufer die Objekte transparent den Typen zuweisen, die Sie darstellen möchten. Z.B:

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
}

Andere Tipps

Woher bekommen Sie die Messeinheit? Ich kann die Aufzählung sehen, aber ich sehe keinen Hinweis darauf an anderer Stelle in der API.

Angenommen, Sie erhalten es von irgendwoher, kann die einfachste Lösung eine Switch -Anweisung sein. Es ist ein bisschen hässlich, aber:

  • Es wird funktionieren
  • Es ist leicht zu verstehen
  • Es wird schnell sein

Ich bin immer noch nicht ganz davon überzeugt, dass ich alles über die Frage verstehe - zumal Sie nicht erklärt haben, wofür die anderen Objekte nach dem Casting verwendet werden.

Die Messeinheit ist im Genehmigungsleitungsdienst enthalten. Um mehr über die Regelklasse auszuarbeiten, wird es als Basisklasse für alle anderen Arten von Regeln verwendet. Es basiert lose auf der Flow -Engine der NXBRE -Geschäftsregel -Engine NXBRE Homepage.

Hier ist ein Beispiel für die Lessdanrole -Klasse (ich habe die ursprüngliche Frage geändert, um die richtige Funktionalität widerzuspiegeln):

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

Hoffe das hilft....

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top