是否可以在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();}
}
答案 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 Binding
,Ruby-style Mixins