C#中的“Catchall”属性?

时间:2009-12-02 10:00:49

标签: c# php dynamic

是否可以在C#中创建“catchall”getter属性?

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 个答案:

答案 0 :(得分:8)

不在C#3中。在C#4.0中,您可以通过expando属性和dynamic关键字实现类似的效果。

答案 1 :(得分:3)

不,你不能在C#中做到这一点。 C#是一种编译语言,在编译时静态解析方法槽。它不支持将属性名称作为字符串或类似的东西传递。

答案 2 :(得分:3)

您可以通过像

这样的黑客来实现这一目标
xyzFactory.Instance.Name

其中静态实例属性的类型为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 :(得分:1)

最接近的是重载索引运算符([])。至少在C#4.0出局之前

答案 4 :(得分:0)

您可以使用property pattern来实现这一点,因为其他人已经说过C#目前不会帮助您实现它

答案 5 :(得分:0)

您可以使用LinFu执行此操作。它使用动态代理来允许Duck Typing and Late BindingRuby-style Mixins