Что такое эквивалент C # этого странного синтаксиса VB для свойства? - PullRequest
1 голос
/ 10 сентября 2009

Я нашел следующий синтаксис в качестве свойства 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 ]

12 голосов
/ 10 сентября 2009

Я полагаю, вы ссылаетесь на аргументы для свойства. Ну, насколько я знаю, C # поддерживает их только для индексаторов, которые не могут иметь имя (например, this[SomeEnum someEnumThing] {}).

Если вы хотите получить аналогичное поведение, вы можете создать вспомогательный класс со свойством indexer и использовать его для предоставления «имени» свойства:

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
    }
}
4 голосов
/ 10 сентября 2009

Невозможно создать свойство в C #, которое имеет аргументы, если только это не свойство по умолчанию:

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

Просто одна из тех областей, где VB отличается от C #. Не рекомендуется использовать такой синтаксис, так как вы не сможете использовать это свойство из проекта C #, который ссылается на эту сборку.

4 голосов
/ 10 сентября 2009

Хмм ... может быть, switch заявление?

2 голосов
/ 10 сентября 2009

Если вы говорите о том, что свойство параметризовано ...

Нет прямого перевода для этого в c #, о котором я знаю. По сути, это перенос из VB6, где вы можете сделать это странное свойство квази-коллекции для класса. Самый простой способ получить подобную функциональность - создать объект словаря и либо публично выставить его, либо создать средство доступа. Когда код VB обращается к этому свойству, например Class.SomeText("SomeKey"), ваш код C # станет Class.SomeDictionaryProperty["SomeKey"]

К сожалению, это не совсем то же самое, так как средство доступа к коллекции не сможет «увидеть» значение индекса. Это было небольшим источником разочарования для меня также в прошлом, происходящем из фона VB.

2 голосов
/ 10 сентября 2009

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
        }
   }

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...