Лучший способ определить, как привести объект к соответствующему типу в C#?

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

  •  03-07-2019
  •  | 
  •  

Вопрос

В настоящее время я разрабатываю службу WCF маршрутизации утверждений, которая позволит пользователю создавать «правила», определяющие способ маршрутизации запроса.Маршрут определяется путем сравнения свойства ObjectToEvaluate класса Request со свойством ObjectToEvaluate класса Rule.Перечисление UnitOfMeasurement определяет, как привести свойство ObjectToEvaluate для каждого класса.

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

Как лучше всего реализовать метод приведения свойства ObjectToEvaluate с использованием перечисления UnitOfMeasurement?

Это было полезно?

Решение

Используйте оператор неявного типа, который проверяет значение перечисления.Таким образом, вызывающие объекты могут прозрачно назначать объекты типам, которые вы хотите их представлять.Например:

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
}

Другие советы

Откуда у вас единица измерения?Я вижу перечисление, но не вижу никаких ссылок на него где-либо еще в API.

Предполагая, что вы его откуда-то получили, самым простым решением вполне может быть оператор переключения.Это немного некрасиво, но:

  • Это сработает
  • Это легко понять
  • Это будет быстро

Я все еще не совсем уверен, что понимаю все по этому вопросу - особенно потому, что вы не объяснили, для чего будут использоваться другие объекты после приведения.

Перечисление «Единица измерения» содержится в службе маршрутизации утверждений.Чтобы подробнее рассказать о классе Rule, отметим, что он используется в качестве базового класса для всех остальных типов правил.Он во многом основан на механизме потока механизма бизнес-правил NxBRE. Домашняя страница NxBRE.

Вот пример класса LessThanRule (я изменил исходный вопрос, чтобы отразить правильную функциональность):

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

Надеюсь это поможет....

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top