我发现以下语法是VB.NET属性,我正在尝试将其转换为c#,但我不知道如何实现它。
Public Property SomeText(ByVal someEnumThing as SomeEnum) As String
Get
Select Case someEnumThing
//figure out what string to return
End Select
End Get
Set(ByVal Value as String)
Select Case someEnumThing
//figure out what string to set
End Select
End Set
End Property
我以前从未见过像这样做过的财产,有什么想法吗?
答案 0 :(得分:12)
我猜你是指这个属性的论据。好吧,据我所知,C#只支持索引器,它们没有名称(例如this[SomeEnum someEnumThing] {}
)。
如果要获得类似的行为,可以创建一个带有索引器属性的辅助类,并使用它来公开属性的“名称”:
public class YourClass {
public struct SomeTextProperty {
private readonly YourClass owner;
internal SomeTextProperty(YourClass owner) {
this.owner = owner;
}
public string this[SomeEnum someEnumThing] {
get {
return owner.GetSomeText(someEnumThing);
}
set {
owner.SetSomeText(someEnumThing, value);
}
}
}
public SomeTextProperty SomeText {
get {
return new SomeTextProperty(this);
}
}
private string GetSomeText(SomeEnum someEnumThing) {
// implementation to get it
}
private void SetSomeText(SomeEnum someEnumThing, string value) {
// implementation to set it
}
}
答案 1 :(得分:4)
嗯......也许是switch
声明?
答案 2 :(得分:4)
在C#中创建具有参数的属性是不可能的,除非它是默认属性:
public double this[int index]
{
get {...}
set {...}
}
VB与C#不同的区域之一。 建议不要使用这样的语法,因为您将无法在引用此程序集的C#项目中使用该属性。
答案 3 :(得分:2)
Select Case将是switch语句。那是你特别提到的吗?
编辑:这是我在评论@ Lucero接近VB.NET语法时所说的内容。
private SomeEnum SomeEnumThing { get; set; }
public string SomeText {
get {
switch (SomeEnumThing) {
//figure out what string to return
}
}
set {
switch (SomeEnumThing) {
//figure out what string to set
}
}
}
答案 4 :(得分:2)
如果您正在谈论该属性已参数化的事实......
我知道c#中没有直接翻译。基本上这是VB6的遗留物,你可以为一个类制作这个奇怪的准集合属性。获得类似功能的最简单方法是创建一个字典对象,并公开它或创建一个访问器。 VB代码访问此属性的地方如Class.SomeText("SomeKey")
,您的C#代码将变为Class.SomeDictionaryProperty["SomeKey"]
不幸的是,这仍然不完全相同,因为集合访问器将无法“看到”索引值。这对我来说也是一个很小的挫折源,过去来自VB背景。