변형 값 주위에 타입 안전 래퍼를 만드는 방법
-
22-07-2019 - |
문제
나는 함께 일하고있다 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에서 "암시 적"키워드 참조
제휴하지 않습니다 StackOverflow