Неявное преобразование C# для универсального класса-оболочки

Я пишу универсальный класс-оболочку для реализации INotifyPropertyChanged для набора свойств в другом из моих классов. Я изучал оператор преобразования implicit, но Я немного смущен тем, как использовать его в универсальном классе. По сути, я хотел бы получить внутреннее значение без необходимости явного вызова внутреннего свойства. Поведение, которое я ищу, в основном такое, как Nullable<T> класс/структура работает там, где, если внутреннее значение не равно null, оно возвращает значение, заключенное во внутреннюю оболочку, напрямую. Пример ниже:

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

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

Во втором примере выше, wrap вернет свое внутреннее значение вместо типа T вместо того, чтобы вызывать внутреннее свойство. Вот как ведет себя Nullable<T>.

При изучении неявных преобразований оказалось, что мне нужно заранее знать тип в соответствии с этой статьей MSDN: Использование операторов преобразования

Нужно ли мне конвертировать в тип dynamic, поскольку тип неизвестен? Пример:

public static implicit operator dynamic(MyWrapperClass w)

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

public implicit operator T(MyWrapperClass w)

EDIT: этот SO Question может привести к тому, что это помечен как обман, но принятый ответ - это не то, что я ищу, поскольку они говорят использовать свойство, которое я уже делаю.


person JNYRanger    schedule 29.01.2014    source источник
comment
Это не ответ на ваш вопрос, а просто наблюдение... можете ли вы использовать АОП, чтобы ваш класс реализовал 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