C#의 적절한 유형에 객체를 캐스팅하는 방법을 결정하는 가장 좋은 방법?

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

  •  03-07-2019
  •  | 
  •  

문제

현재 사용자가 요청을 라우팅하는 방법을 결정하는 "규칙"을 작성할 수있는 승인 라우팅 WCF 서비스를 개발 중입니다. 경로는 요청 클래스의 "ObjecttoEvaluate"속성을 "규칙"클래스의 "ObjectToEvaluate"속성과 비교하여 결정됩니다. "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
    }
}

"UnitofMeasurement"열거를 사용하여 "ObjectToEvaluate"속성을 시전하는 방법을 구현하는 가장 좋은 방법은 무엇입니까?

도움이 되었습니까?

해결책

열거 값을 확인하는 암시 적 유형 연산자를 사용하십시오. 그렇게하면 발신자가 표현하려는 유형에 객체를 투명하게 할당 할 수 있습니다. 예 :

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의 다른 곳에서는 언급이 보이지 않습니다.

어딘가에서 얻을 수 있다고 가정하면 가장 쉬운 솔루션은 스위치 문일 수 있습니다. 약간 추악하지만 :

  • 작동합니다
  • 이해하기 쉽습니다
  • 빠질 것입니다

나는 여전히 그 질문에 대한 모든 것을 이해한다고 확신하지는 않습니다. 특히 캐스팅 후 다른 물체가 무엇을 사용할 것인지 설명하지 않았기 때문에.

측정 단위는 승인 라우팅 서비스 내에 포함되어 있습니다. 규칙 클래스에 대해 더 자세히 설명하기 위해 다른 모든 유형의 규칙에 대한 기본 클래스로 사용됩니다. NXBRE 비즈니스 규칙 엔진의 유량 엔진을 기반으로 느슨하게 nxbre 홈페이지.

다음은 Lesshanrule 클래스의 예입니다 (올바른 기능을 반영하기 위해 원래 질문을 수정했습니다).

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