2009-09-10 52 views
1

我发现以下语法作为一个VB.NET属性,我试图将其转换为C#,但我不知道如何实现这一点。什么是这种奇怪的VB语法属性的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

C#不支持“索引属性”,即带参数的属性。 VB的确如此。仅供参考,在C#4中,我们将允许对COM对象进行某些*使用索引属性;很难调用设计为从VB调用的遗留COM对象的索引属性。但我们目前不打算支持在C#中定义新的索引属性。 – 2009-09-10 20:29:26

回答

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

FWen,Ayende在他的Rhino.Commons库中写了一个小窍门,在C#中“命名”索引器。 – 2009-09-10 17:55:29

+0

@Lucero你钉了它,我希望有一个C#等价物,但我想我现在只是拧了。 =( – Joseph 2009-09-10 17:56:16

+0

+1这是正确的答案 – 2009-09-10 17:56:33

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

这是不可能创建一个属性在C#中有参数,除非它是默认属性:

public double this[int index] 
{ 
    get {...} 
    set {...} 
} 

只是VB与C#不同的那些区域之一。 不建议使用这样的语法,因为您将无法从引用此程序集的C#项目中使用该属性。

+0

这就是我所害怕的... – Joseph 2009-09-10 17:55:18

2

如果你在谈论的事实,性质是参数...

有没有直接的翻译本在C#中,我知道的。基本上这是来自VB6的遗留问题,您可以为这个类创建这个奇怪的准收集属性。获得类似功能的最简单方法是创建一个字典对象,并公开公开它或创建一个访问器。如果VB代码访问此属性,如Class.SomeText("SomeKey"),则您的C#代码将变为Class.SomeDictionaryProperty["SomeKey"]

不幸的是,由于集合访问器无法“查看”索引值,因此这仍然不尽相同。这对于我来说也是一个令人沮丧的微小的来源,以前来自VB背景。

相关问题