2014-02-06 83 views
0

聽起來很奇怪,我想訪問不是的東西。通過調用方法獲取不存在變量的值

下面是一個例子:

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()方法時,問題就開始了。

既然公共變量已被更改,刪除或添加了新變量,則需要進行一些重構才能使應用程序再次運行。當有混合調用可以直接訪問一個公共變量和一個同樣的方法時,它看起來很糟糕。

請注意,我知道如何以標準方式修復我的代碼;我只是感興趣,如果上述技術將工作。

+1

聽起來像是你需要一個['Dictionary'(http://msdn.microsoft.com/en-us/library/xfhwa508(V = vs.110)的.aspx) –

+0

看DynamicObject類: http://msdn.microsoft.com/en-us/library/system.dynamic.dynamicobject(v=vs.110).aspx – MarcinJuraszek

+0

@CreativeMagic如果desiredObject不包含'variableName',會發生什麼......什麼是應該從'returnsVariables'返回? – Leo

回答

1

聽起來像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" 
+0

而不是聲明「動態x」我可以使用「MyClass x = new MyClass();」? –

+1

不幸的是,因爲C#編譯器的動態標誌不檢查有問題的對象上的成員/調用。 – DavidN