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





Откуда вы берете единицу измерения? Я вижу перечисление, но не вижу ссылок на него в другом месте 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 - это имя Java. Я обновил исходный ответ.
Перечисление единиц измерения содержится в службе маршрутизации утверждения. Чтобы подробнее рассказать о классе 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;
}
}
Надеюсь это поможет....
Я не могу найти тип исключения ClassCastException в платформе .NET. Что является эквивалентом исключения ClassCastException в C#?