Есть ли способ «сообщить» IntelliSense и компилятору, что класс реализует интерфейс, фактически не реализуя его? - PullRequest
0 голосов
/ 24 мая 2019

Я использую Fody.PropertyChanged и Fody.Validar в моем проекте на C #, чтобы избежать написания стандартного кода.Давайте предположим, что у меня есть некоторый класс A:

[AddINotifyPropertyChanged]
[InjectValidation]
public class A { }

Я должен использовать объекты типа A в других частях моего кода, которым требуется тип A для реализации интерфейсов, таких как INotifyPropertyChanged или INotifyDataErrorInfo.Есть два известных способа сделать это:

  1. Реализация интерфейсов вручную (много шаблонов):
[AddINotifyPropertyChanged]
[InjectValidation]
public class A: INotifyPropertyChanged, INotifyDataErrorInfo { ... }
Приведение объекта типа A к требуемым интерфейсам (больше кода, ReSharper генерирует предупреждения о подозрительных приведениях, могут сбиться универсальные методы):
public static T DoSomething<T>(T arg) where T: INotifyPropertyChanged { ... }
var a = new A();
var b = DoSomething((INotifyPropertyChanged) a) // Returns INotifyPropertyChanged.

Есть ли способ "сообщить"IntelliSense и компилятор, что класс реализует интерфейс, фактически не реализуя его, и позволяет Fody сделать эту работу?

[AddINotifyPropertyChanged]
[InjectValidation]
[Implements(typeof(INotifyPropertyChanged))]
public class A { }
var a = new A();
var b = DoSomething(a) // Returns A.

1 Ответ

1 голос
/ 24 мая 2019

Что именно и почему вы хотите от компилятора?

Он не имеет понятия о том, что будет добавлено после компиляции.Таким образом, вы запрашиваете способ нарушить одно из правил компилятора, чтобы некоторые приведения не выглядели сомнительными.Нет чистого способа сделать это.

Операция приведения - ваш единственный способ.Никто, кроме вас, не знает, что какой-то класс вдруг что-то реализует, независимо от того, что он делает во время компиляции.

Правила ReSharper могут быть отключены, если они слишком вас волнуют.

...