2012-02-07 167 views
4

是否有可能在C#中使用類似變量名稱的字符串?
我有一個:
字符串作爲變量名稱

String x = "matrix1_2"; 
Microsoft.VisualBasic.PowerPacks.RectangleShape y = ???; 


??? - 應該有變量的名稱... matrix1_2

+1

我認爲你很容易混淆變量的名稱和值。或者我很困惑。 – kenny 2012-02-07 20:04:18

+3

它可能*使用反射,但這通常不是一個好主意。你想實現什麼?可能有更好的方法。 – Blorgbeard 2012-02-07 20:06:02

+0

可能dupe http://stackoverflow.com/questions/4629/c-sharp-eval-equivalent – MikeM 2012-02-07 20:06:44

回答

7

不,你不能,誠實地說沒有這樣的功能是沒有道理的。

如果您需要動態分配與鍵和值的一些數據,你可以使用一個字典:

Dictionary<string, RectangleShape> shapes = new Dictionary<string, RectangleShape>(); 
shapes.Add("matrix1_2", new RectangleShape(...)); 

然後,你可以簡單地閱讀「變量」像

shapes["matrix1_2"] 
+1

知道了...我愛你!...需要這個!...非常感謝! – 2012-02-07 20:14:26

+0

沒問題...:=) – 2012-02-07 20:19:32

+0

@hradecek如果你覺得你的問題已經回答了,你可以通過點擊答案左邊的檢查符號來「接受」它。 – ispiro 2012-02-07 20:57:52

1

這是不可能的。

您不能在C#,VB.NET或任何.NET語言中使用動態變量名稱。不支持這種功能。

+1

Roslyn支持這樣的變量訪問,但除此之外,這是正確的。 – McKay 2012-02-07 20:06:08

+0

@McKay - Roslyn是一個非常不同的問題。它不是** C#。 – Oded 2012-02-07 20:07:15

+0

@已完成,這當然不是最好的方法,我不認爲,但如果他知道變量駐留在什麼程序集中,他應該能夠使用反射,對嗎? – 2012-02-07 20:08:04

2

不,它是不。如果「matrix1_2」是一個局部變量,那麼你不能做到這一點作爲變量甚至可能不存在經過編譯通過,如果它實際上是一個實例字段,則反映可能有幫助:

object value = obj.GetType().GetField(fieldName).GetValue(obj); 
0

看起來像一個壞主意。嘗試使用枚舉或自己的數據類型/類

0

你可以用反射,但我懷疑在這種情況下,這是一個更好的設計,你可以實現,比使用反射更好。如果你提供了更多的信息,可能我們中的一個人可以幫助你。

聲明一個變量字典:

Dictionary<string, RectangleShape> rectangleDictionary = new Dictionary<string, RectangleShape>(); 

然後,在那裏你會normallay寫 「matrix1_2 = someValue中;」,而是寫:

rectangleDictionary.add("matrix1_2", somevalue) 

然後你就可以與合作變量名稱:

rectangleDictionary["matrix1_2"] = someothervalue; 
rectangleDictionary["matrix1_2"].someproperty = something; 

Microsoft.VisualBasic.PowerPacks.RectangleShape y = rectangleDictionary["matrix1_2"]; 
+0

可能有一種方法可以通過使用Dictionary <>對象來存儲關鍵字和值,從而完成您想要的操作。 – 2012-02-07 20:08:25

+0

反射不允許訪問方法中的變量:只有方法,字段,類型和屬性。 – StriplingWarrior 2012-02-07 20:08:30

+0

@StriplingWarrior這確實使問題複雜化了,儘管這可能會解決......絕對不值得解決,因爲我確信他的問題有更好的選擇。 – 2012-02-07 20:19:02

0

「matrix1_2」是否已經存在?換句話說,當你說y = ???時你想要訪問一個現有的變量或創建一個。

據我所知,沒有辦法在運行時創建一個新的「named」實例。但是,您可以檢索現有字段的名稱並使用System.Reflection選擇它們。上述

String x = "matrix1_2"; 
Microsoft.VisualBasic.PowerPacks.RectangleShape y; 
Type type = typeof(MyType); // Get type pointer 
FieldInfo[] fields = type.GetFields(); 
foreach (var field in fields) 
{ 
     if (field.Name == "matrix1_2") 
     { 
      y = field; 
     } 
} 

MyType是什麼類matrix1_2生活中的名字。

+0

如果matrix1_2不在類中,它只是方法中的一個變量? – McKay 2012-02-07 20:47:57

+0

@McKay - 我不相信變量名保存在方法中。一旦你編譯到CIL字節碼,它們被位置引用(例如,V_0,V_1,V_2等),並且你給它們的任何名字都會丟失。因此,即使您能夠動態創建新的本地變量,在C#程序中引用它也需要一些深刻的魔力。您可能可以使用[AOP](http://en.wikipedia.org/wiki/Aspect-oriented_programming)(或許與[PostSharp](http://www.sharpcrafters.com/) – Justin 2012-02-20 18:34:28

+0

這正是我的觀點他想訪問一個理論上的任意變量,如果它是一個字段,那麼這個代碼就可以工作,如果它是一個屬性,其他代碼就可以工作,如果它是一個參數,其他代碼可以工作,你沒有一個非常普遍的解決方案。 – McKay 2012-02-21 14:50:04

0

可以以這種方式從一個動態類型(使用C#在Silverlight 5項目)獲得一個字段值。

Type itemType = item.GetType(); 
try 
{ 
    PropertyInfo field = itemType.GetProperty(fieldName); 
    object val = field.GetValue(item, null); 
} 
catch (Exception ex) 
{ 
    // field doesn't exist, do something else 
} 

*如果「項目」是在運行時產生的動態類型(但不是必須)和「字段名」是你正在尋找的屬性名稱的字符串。