문제

나는 함께 일하고있다 OPC 서버 데이터 태그를 다음으로 설명하는 변형 유형으로 저장하는 제어 System.runtime.interopservices.varenum. 이러한 유형에는 다음과 같은 VT_BSTR (String), VT_I2 (Short) 및 VT_I4 (Long)가 포함됩니다.

이 모든 값은 서버에서 저장됩니다 사물 그리고 내가 그들을 가져올 때 올바른 가치로 캐스트해야합니다.

다음과 같은 일을 할 수 있다는 것을 알고 있습니다.

object tagValue = (object)"testing"; //this would be returned from a function rather than created this way!!
var typedVariant = new TypedVariant<string>(tagValue);
string actualString = typedVariant.Value;

여기서 typedvariant는 다음과 같은 일반적인 클래스입니다.

class TypedVariant<T> where T : class, struct
{          
    public TypedVariant(object variant)
    {
        Value = variant as T;
    }

    public T Value { private set; get; }

    public static implicit operator TypedVariant<T> (T m)
    {
        // code to convert from TypedVariant<T> to T
        return new TypedVariant<T>(m);
    }

    public static implicit operator T (TypedVariant<T> m)
    {
        // code to convert from T to TypedVariant<T>
        return m.Value;
    }  
}

그러나 런타임에 모든 것을 할 수있는 방법이 있습니까? 즉 다음과 같은 것입니다.

TypedVariant<> typedVariant = TypedVariant.Create(VarEnum.VT_BSTR, tagValue);
//typedVariant should now be of type TypedVariant<string>    

분명히이 코드는 컴파일되지 않지만 이렇게 할 수 있습니까?

업데이트: @Konamiman의 제안에 따라, 나는 암시 적 주조를 허용하도록 수업을 변경했습니다. 이제이 코드를 작성할 수 있으며 모든 TypeSafe이므로 생성 된 것과는 다른 유형으로 변형을 저장할 수 없습니다.

object objectStr = (object)"testing"; //created this way just for testing        
TypedVariant<string> typedVariant = (string)objectStr;
string actualString = typedVariant;
도움이 되었습니까?

해결책

나는 그렇게 생각합니다 TypedVariant 래퍼는 좋은 생각입니다. 랩핑 유형에서 내재 변환 연산자를 무시하기 위해 확장 할 수 있으며 다음과 같이 더 투명하게 사용할 수 있습니다.

var typedVariant = (string)tagValue;
string actualString = typedVariant;

여기를 봐: MSDN에서 "암시 적"키워드 참조

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top