"Catchall" Свойства в C #? - PullRequest
       17

"Catchall" Свойства в C #?

1 голос
/ 02 декабря 2009

Можно ли создать свойство getter "catchall" в C #?

class xyzFactory {

   public static object this.*(string name){
       get { return new name();}
  }
}

В PHP вы бы написали что-то вроде

//static getters are new to 5.3, so I didn't put it here.

class xyzFactory{
    public _get($name){ return $name();}
}

Ответы [ 6 ]

8 голосов
/ 02 декабря 2009

Не в C # 3. В C # 4.0 вы можете достичь чего-то подобного с помощью свойств expando и ключевого слова dynamic.

3 голосов
/ 02 декабря 2009

Вы можете достичь этого с помощью взлома типа

xyzFactory.Instance.Name

где статическое свойство Instance имеет тип dynamic

И сделать вас xyzFactory, производным от класса DynamicObject.

public xyzFactory : DynamicObject
{
    private static xyzFactory _instance = new xyzFactory();

    private xyzFactory() { }

    public static dynamic Instance
    {
        get{ return _instance; }
    }

    public override bool TryGetMember(GetMemberBinder binder, out object result) {
        // ...
    }
}
3 голосов
/ 02 декабря 2009

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

1 голос
/ 02 декабря 2009

Самое близкое, что вы можете получить - это оператор индекса перегрузки ([]). По крайней мере, пока не выйдет C # 4.0

0 голосов
/ 02 декабря 2009

Вы можете сделать это с помощью LinFu . Он использует динамический прокси для учета Duck Typing and Late Binding, Ruby-style Mixins

0 голосов
/ 02 декабря 2009

Вы можете использовать шаблон свойства для реализации этого, как и другие говорили, что C # в настоящее время не поможет вам реализовать его, хотя

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