2009-04-12 35 views
2

您如何在C#中確定調用方法時使用的變量的名稱?確定用作方法參數的變量的名稱

例子:

public void MyTestMethod1() 
{ 
    string myVar = "Hello World"; 
    MyTestMethod2(myVar); 
} 

public void MyMethod2(string parm) 
{ 
    // do some reflection magic here that detects that this method was called using a variable called 'myVar' 
} 

我明白,參數可能不會永遠是一個變量,但我使用它的地方是在一些驗證代碼,我也盼望着在開發可以明確聲明友好他們正在驗證的值的名稱,如果他們不這樣,它只是從他們稱爲該方法的var的名稱推斷它...

+0

的[找到傳遞給函數在C#中的變量名(可能重複http://stackoverflow.com/questions/72121/finding-the-variable-name-傳遞到一個功能在C - 銳) – nawfal 2013-04-27 16:14:16

回答

4

不幸的是,這將是非常困難的,如果不是不可能的。

爲什麼你需要最初發送的變量名?

請記住,有可能不使用的實際變量:

MyMethod2(myVar + "! 123"); 

在這種情況下,保持myVar的只是值的部分,其餘部分在運行時表達式計算。

+0

謝謝 - 我修改了我的問題來回答你的問題。 – KevinT 2009-04-12 20:31:41

1

變量意味着將方便的標識符分配給實體的語義。以你所描述的方式來編程它們看起來像是一個相當大的代碼味道。此外,如果知道這真的很重要,難道你只是通過第二個參數?


編輯:更新了自己的問題,包括該行中的OP:

我明白,參數可能不會永遠是一個變量,但我使用它的地方是在一些驗證代碼我希望開發者可以明確地聲明他們正在驗證的值的友好名稱,如果他們不這樣做,那麼它只是從他們稱爲方法的var的名稱中推斷出它......

如果他們明確聲明它,這對你很重要,它肯定應該作爲參數傳遞給函數。

6

有一種方法,但它很醜陋。

public void MyTestMethod1() 
{ 
    string myVar = "Hello World"; 
    MyTestMethod2(() => myVar); 
} 

public void MyMethod2(Expression<Func<string>> func) 
{ 
    var localVariable = (func.Body as MemberExpression).Member.Name; 
    // localVariable == "myVar" 
} 

正如你所看到的,所有呼叫都必須包裝成lambda表達式,如果你開始做任何事情都要在lambda除了返回單個變量這種方法打破了。

1

這聽起來像你應該使用枚舉作爲變量的標識符,而不是試圖確定變量的名稱。變量的重點在於它只是一個人類可讀的名字來表示一點內存。

你可以這樣做:

public void MyTestMethod1() 
{ 
    string myVar = "Hello World"; 
    MyTestMethod2(myVar, VariableType.MyVar); 
} 

public void MyMethod2(string parm, VariableType type) 
{ 
    if (type == VariableType.MyVar) 
    { 
    } 
} 
相關問題