Неявно C# преобразуване за общ клас обвивка

Пиша общ клас обвивка, за да внедря INotifyPropertyChanged за куп свойства в друг от моите класове. Правих някои проучвания относно оператора за преобразуване implicit, но Малко съм объркан как да го използвам в общ клас. По същество бих искал да получа вътрешно обвитата стойност, без да е необходимо изрично да извиквам вътрешното свойство. Поведението, което търся, е по същество как Nullable<T> class/struct работи, когато вътрешната стойност не е null, тогава ще върне вътрешно обвитата стойност директно. Пример по-долу:

//current behavior
MyWrapperClass<int> wrapped = new MyWrapperClass();
int startCount = wrapped.Data;

//behavior I am looking to implement
int startCount = wrapped

Във втория пример по-горе wrapped ще върне своята вътрешно обвита стойност вместо тип T, вместо да се налага да извиква вътрешното свойство. Ето как се държи Nullable<T>.

Когато разглеждах имплицитни преобразувания, се оказа, че трябва да знам типа предварително според тази статия в MSDN: Използване на оператори за преобразуване

Трябва ли да конвертирам в тип dynamic, тъй като типът не е известен? Пример:

public static implicit operator dynamic(MyWrapperClass w)

Или мога да извърша имплицитно преобразуване на тип T, както се вижда по-долу? Това би ми попречило да направя метода статичен, който забелязах, че се използва във всички примерни кодове, които съм виждал, включващи както неявни, така и явни оператори за преобразуване. Тази опция ми се струва "погрешна", но тук не можах да намеря много информация по темата.

public implicit operator T(MyWrapperClass w)

РЕДАКТИРАНЕ: Този SO въпрос може да причини това да бъде етикетиран като измама, но приетият отговор не е това, което търся, тъй като те казват да използвам имота, който вече правя.


person JNYRanger    schedule 29.01.2014    source източник
comment
Това не е отговор на въпроса ви - а просто наблюдение... можете ли да използвате AOP, за да накарате вашия клас да прилага INotifyPropertyChanged? Нещо като Fody github.com/Fody/PropertyChanged или Postsharp postsharp.net ?   -  person Jay    schedule 30.01.2014
comment
Благодаря за предложението! Никога преди не съм използвал Fody или PostSharp, но определено ще ги разгледам. По същество това се прави, така че ако свойствата са променени, ще бъде зададен флаг, за да ги запази обратно в конфигурационния файл, който първоначално ги е генерирал. Бихте ли имали пример как да използвате някое от тези решения, за да направите това?   -  person JNYRanger    schedule 30.01.2014
comment
Fody е лесно - използвайте NuGet, за да инсталирате Fody (PropertyChanged.Fody ще свърши работа) във вашия проект и след това украсете класа си с [ImplementPropertyChanged]... това е - вашите свойства вече прилагат INotifyPropertyChanged, когато са изградени! Знам, че PostSharp може да го направи (google LocationInterceptionAspect, за да го направите сами), но имам безплатен лиценз и това е „платена“ функция, така че никога не съм го правил с магическия атрибут. И двете вплитат имплементацията на INotifyPropertyChged в изходния код, след като е бил компилиран от MSBuild (мисля - това е нещо като магия!) Успех!   -  person Jay    schedule 30.01.2014


Отговори (1)


След известно тестване изглежда, че втората опция работи без проблем и все още си позволява да бъде статична. Използвах отговора на @AndersForsgren на този въпрос (не приет отговор), за да разберете това. Очевидно не съм разбрал как работи неявното претоварване на оператора. Кодовият фрагмент, който коригира това, е както следва:

public static implicit operator T(WrapperClass<T> input)
{
     return input.Data;
}
person Community    schedule 29.01.2014