A melhor maneira de determinar como converter um objeto em um tipo apropriado em C#?
Pergunta
Atualmente estou desenvolvendo um serviço WCF de roteamento de aprovação que permitirá que um usuário crie "regras" que determinam como uma solicitação é roteada.A rota é determinada comparando a propriedade "ObjectToEvaluate" da classe Request com a propriedade "ObjectToEvaluate" da classe "Rule".A enumeração "UnitOfMeasurement" determina como converter a propriedade "ObjectToEvaluate" para cada 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
}
}
Qual seria a melhor maneira de implementar o método para converter a propriedade "ObjectToEvaluate" usando o enum "UnitOfMeasurement"?
Solução
Use um operador de tipo implícito que verifique o valor da enumeração. Dessa forma, os chamadores podem atribuir transparentemente os objetos aos tipos que você deseja representá -los. Por exemplo:
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
}
Outras dicas
De onde você está tirando a unidade de medida?Posso ver o enum, mas não vejo nenhuma referência a ele em nenhum outro lugar da API.
Supondo que você o obtenha de algum lugar, a solução mais fácil pode ser uma instrução switch.É um pouco feio, mas:
- Vai funcionar
- É fácil de entender
- Será rápido
Ainda não estou totalmente convencido de que entendi tudo sobre a questão - principalmente porque você não explicou para que os outros objetos serão usados após a conversão.
A unidade de medição enum está contida no serviço de roteamento de aprovação. Para elaborar mais sobre a classe de regra, é usada como uma classe base para todos os outros tipos de regras. É vagamente baseado no mecanismo de fluxo do mecanismo de regras de negócios nxbre Página inicial do nxbre.
Aqui está um exemplo da classe LessThanRule (modifiquei a pergunta original para refletir a funcionalidade correta):
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;
}
}
Espero que isto ajude....