سؤال

أنا أعمل مع 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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top