有什么方法可以 "tell" IntelliSense 和 class 实现接口而不实际实现它的编译器吗?

Is there any way to "tell" IntelliSense and compiler that class implements the interface without actually implementing it?

我在我的 C# 项目中使用 Fody.PropertyChanged 和 Fody.Validar 以避免编写样板代码。假设我有一些 class 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.

有什么方法可以 "tell" IntelliSense 和编译器 class 实现接口而不实际实现它并让 Fody 完成这项工作?

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

您希望编译器提供什么以及为什么?

不知道 将添加什么 post-compilation。因此,您正在寻求一种方法来打破编译器的其中一条规则,以便某些强制转换看起来不那么可疑。没有干净的方法。

cast操作是你唯一的出路。除了您之外,没有人知道某些 class 会突然实施某事,无论它在 compile-time 上做了什么。

如果您太担心 ReSharper 规则,可以将其关闭。