通过调用方法获取不存在变量的值
听起来很奇怪,我想访问不是的东西。通过调用方法获取不存在变量的值
下面是一个例子:
int tempVar = myObject.myVar // myVar does not exist;
在现实中,我希望类运行的方法,这将坐不存在的变量作为参数:
object returningVariables(string variableName)
{
object desiredObject; // a concrete object that I have stored somewhere in an array inside the class
// going trough some List that contains names of all variables, when it finds it
// return it
return desiredObject;
}
我会尽力在一个具体的例子中解释我想达到什么以及为什么。
我有一个类存储对象的统计信息:名称,级别,速度,大小等。 他们应该通过方法访问StatData getStat(string statName)
;
通过方法void MakeStat()
创建统计信息。当一些统计数据在类中被创建为公共变量并且被其他分类访问而不是通过getStat()方法时,问题就开始了。
既然公共变量已被更改,删除或添加了新变量,则需要进行一些重构才能使应用程序再次运行。当有混合调用可以直接访问一个公共变量和一个同样的方法时,它看起来很糟糕。
请注意,我知道如何以标准方式修复我的代码;我只是感兴趣,如果上述技术将工作。
听起来像DynamicObject会帮助你在这里。您可以覆盖该类的不同方法,以便在该对象上调用/访问:成员,调用等。使用动态方法意味着您将无法再使用智能感知。你可以找到更多的信息here。
public class MyDynamicObject : DynamicObject {
public override bool TryGetMember(GetMemberBinder binder, out Object result){
if (binder.Name == "myVar"){
result = "xyz";
return true;
}
result = null;
return false;
}
}
// Usage
dynamic x = new MyDynamicObject();
Console.WriteLine (x.myVar); // will output "xyz"
而不是声明“动态x”我可以使用“MyClass x = new MyClass();”? –
不幸的是,因为C#编译器的动态标志不检查有问题的对象上的成员/调用。 – DavidN
听起来像是你需要一个['Dictionary'(http://msdn.microsoft.com/en-us/library/xfhwa508(V = vs.110)的.aspx) –
看DynamicObject类: http://msdn.microsoft.com/en-us/library/system.dynamic.dynamicobject(v=vs.110).aspx – MarcinJuraszek
@CreativeMagic如果desiredObject不包含'variableName',会发生什么......什么是应该从'returnsVariables'返回? – Leo