什么是这个奇怪的VB语法的c#等价物?

时间:2009-09-10 17:46:29

标签: c# vb.net properties

我发现以下语法是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

我以前从未见过像这样做过的财产,有什么想法吗?

5 个答案:

答案 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背景。