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

В настоящее время я разрабатываю службу 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»?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
0
583
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

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

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

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

Ответ принят как подходящий

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

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
}

Я не могу найти тип исключения ClassCastException в платформе .NET. Что является эквивалентом исключения ClassCastException в C#?

Michael Kniskern 16.10.2008 21:47

Я использовал это решение для приведения объекта к соответствующему типу ... Спасибо за ваш вклад.

Michael Kniskern 17.10.2008 04:52

Извините за это ... ClassCastException - это имя Java. Я обновил исходный ответ.

JSBձոգչ 21.10.2008 20:03

Перечисление единиц измерения содержится в службе маршрутизации утверждения. Чтобы подробнее рассказать о классе 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;
    }
}

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

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