"Catchall"

6 Cevap

C # bir "herkesi kucaklayan" alıcı özelliği oluşturmak mümkün mü?

class xyzFactory {

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

PHP gibi bir şey yazmak istiyorum

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

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

6 Cevap

Sen gibi bir hack ile elde edebilirsiniz

xyzFactory.Instance.Name

statik Örnek mülkiyet türü olduğu dynamic

Ve DynamicObject sınıftan türetilmiş xyzFactory olun.

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

     private xyzFactory(){}

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

     public override bool  TryGetMember(GetMemberBinder binder, out object result){...}
}

C # 3. Olarak C # 4.0 Eğer expando özellikleri ve dynamic anahtar kelime ile böyle bir şey başarmak olamazdı.

Hayır, C # bunu yapamam. C # derlenen bir dildir ve statik derleme zamanında yöntem yuvaları giderir. Bu dize ya da buna benzer şeyler olarak özellik adını geçirmeden desteklemiyor.

Alabileceğiniz en yakın aşırı yük endeksi operatörü ([]) 'dir. C # 4.0 üzerinden en az kadar

Diğerleri söylediler bunu uygulamak için property pattern kullanabilirsiniz, C # şu anda bile bunu uygulamak yardımcı olmaz

Sen LinFu ile bunu yapmak mümkün olabilir. Bu Duck Typing and Late Binding, Ruby-style Mixins olanak sağlamak için dinamik bir proxy kullanır