كيفية جعل نوع آمنة التفاف حول البديل القيم
-
22-07-2019 - |
سؤال
أنا أعمل مع OPC Server التحكم الذي يقوم بتخزين البيانات العلامات كما البديل أنواع وصفها النظام.وقت التشغيل.InteropServices.VarEnum.هذه الأنواع تشمل ما يلي ، VT_BSTR (سلسلة) ، VT_I2 (قصيرة) VT_I4 (طويلة).
كل هذه القيم المخزنة على الملقم مثل الكائنات ومن ثم يجب أن يلقي إلى القيمة الصحيحة عندما جلب لهم.
وأنا أعلم أنني يمكن أن تفعل شيئا مثل التالية:
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