有没有办法“告诉” IntelliSense和编译器该类实现了接口而不实际实现该接口?

时间:2019-05-24 10:56:51

标签: c# fody fody-propertychanged

我在C#项目中使用Fody.PropertyChanged和Fody.Validar,以避免编写样板代码。假设我有一些A类:

[AddINotifyPropertyChanged]
[InjectValidation]
public class A { }

我必须在代码的其他部分中使用类型A的对象,这些对象需要类型A来实现INotifyPropertyChanged或INotifyDataErrorInfo之类的接口。有两种已知的方法:

  1. 手动实现界面(很多样板):
[AddINotifyPropertyChanged]
[InjectValidation]
public class A: INotifyPropertyChanged, INotifyDataErrorInfo { ... }
  1. 到所需接口的类型为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 个答案:

答案 0 :(得分:1)

您到底想从编译器中得到什么?为什么?

不知道,将在编译后添加什么。因此,您正在寻求一种打破编译器规则之一的方法,以使某些强制转换不会显得阴暗。没有干净的方法。

强制转换操作是您唯一的方法。除了您自己,没人知道某个类会突然实现某些东西,而不管它在编译时的作用如何。

如果他们太担心您,可以关闭ReSharper规则。