Meilleure façon de déterminer comment convertir un objet en un type approprié en C #?

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

  •  03-07-2019
  •  | 
  •  

Question

Je suis en train de développer un service WCF de routage d'approbation qui permettra à un utilisateur de créer des "règles". qui déterminent comment une demande est acheminée. La route est déterminée en comparant les options "ObjectToEvaluate". propriété de la classe Request par rapport à " ObjectToEvaluate " propriété de la " règle " classe. Le " UnitOfMeasurement " enum détermine comment transtyper le fichier "ObjectToEvaluate". propriété pour chaque 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
    }
}

Quel serait le meilleur moyen d'implémenter la méthode pour transtyper le fichier "ObjectToEvaluate"? propriété utilisant la propriété " UnitOfMeasurement " enum?

Était-ce utile?

La solution

Utilisez un opérateur de type implicite qui vérifie la valeur de l'énum. De cette manière, les appelants peuvent affecter de manière transparente les objets aux types que vous souhaitez les représenter. Par exemple:

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
}

Autres conseils

Où trouvez-vous l'unité de mesure? Je peux voir l'énumération, mais je ne vois aucune référence à cette énumération ailleurs dans l'API.

En supposant que vous l’obteniez quelque part, la solution la plus simple pourrait bien être une instruction switch. C'est un peu moche, mais:

  • ça va marcher
  • C'est facile à comprendre
  • ça va être rapide

Je ne suis toujours pas tout à fait convaincu de tout comprendre sur la question - surtout que vous n'avez pas expliqué à quoi serviront les autres objets après le casting.

Le enum Unité de mesure est contenu dans le service de routage d'approbation. Pour en savoir plus sur la classe Rule, elle est utilisée comme classe de base pour tous les autres types de règles. Il est vaguement basé sur le moteur de flux de la page d'accueil de NxBRE .

Voici un exemple de la classe LessThanRule (j'ai modifié la question d'origine pour refléter la fonctionnalité correcte):

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

J'espère que cela vous aidera ....

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top