不幸的是,C# 没有实现我们在 VB.NET 或类似中看到的默认属性的概念。通常为此给出的解决方案是使用转换运算符来创建类的新实例......但是您会丢失其余的属性和状态。
例如,这个 VB.NET 类:
public class MyClass
Public myNumber As Integer
Private myString As String
Default Property myProperty As String
Get
return myString
End Get
Set(ByVal Value As String)
myString = Value
End Set
End Property
End Class
在 VB 中你可以这样做:
Dim i As New MyClass
i.myInteger = 10
i = "Hello"
VB.NET 编译器定位默认属性并将其用作赋值的目标。
现在考虑 C# 中的相同代码,在同一个类上运行:
var i = new MyClass();
i.myInteger = 10;
i = "Hello";
由于 C# 不知道默认属性,因此无法编译。使用标准转换技术,我们可以定义一个如下所示的转换运算符:
public static implicit operator MyClass(string value)
{
return new MyClass { myProperty = value };
}
现在我们可以执行i = "Hello"; 并且myProperty 值当然会被设置...但myInteger 字段现在将被重新初始化为默认值。
可悲的是,我们可以用DefaultPropertyAttribute 装饰一个 C# 类来告诉 VB.NET 在使用我们的类时它应该使用哪个属性作为默认值,但是我们不能在 C# 中使用该信息而不进行一些反射技术。
此处的其他答案提供了解决您列出的特定情况的解决方案,但没有解决方案可以提供与 VB.NET 语言相同的默认属性功能。除非您想开始在 Roslyn 上进行 hack 并创建自己的 C# 版本:P