是否有可能在C#中使用類似變量名稱的字符串?
我有一個:
字符串作爲變量名稱
String x = "matrix1_2";
Microsoft.VisualBasic.PowerPacks.RectangleShape y = ???;
??? - 應該有變量的名稱... matrix1_2
是否有可能在C#中使用類似變量名稱的字符串?
我有一個:
字符串作爲變量名稱
String x = "matrix1_2";
Microsoft.VisualBasic.PowerPacks.RectangleShape y = ???;
??? - 應該有變量的名稱... matrix1_2
不,你不能,誠實地說沒有這樣的功能是沒有道理的。
如果您需要動態分配與鍵和值的一些數據,你可以使用一個字典:
Dictionary<string, RectangleShape> shapes = new Dictionary<string, RectangleShape>();
shapes.Add("matrix1_2", new RectangleShape(...));
然後,你可以簡單地閱讀「變量」像
shapes["matrix1_2"]
知道了...我愛你!...需要這個!...非常感謝! – 2012-02-07 20:14:26
沒問題...:=) – 2012-02-07 20:19:32
@hradecek如果你覺得你的問題已經回答了,你可以通過點擊答案左邊的檢查符號來「接受」它。 – ispiro 2012-02-07 20:57:52
不,它是不。如果「matrix1_2」是一個局部變量,那麼你不能做到這一點作爲變量甚至可能不存在經過編譯通過,如果它實際上是一個實例字段,則反映可能有幫助:
object value = obj.GetType().GetField(fieldName).GetValue(obj);
看起來像一個壞主意。嘗試使用枚舉或自己的數據類型/類
你可以用反射,但我懷疑在這種情況下,這是一個更好的設計,你可以實現,比使用反射更好。如果你提供了更多的信息,可能我們中的一個人可以幫助你。
聲明一個變量字典:
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"];
可能有一種方法可以通過使用Dictionary <>對象來存儲關鍵字和值,從而完成您想要的操作。 – 2012-02-07 20:08:25
反射不允許訪問方法中的變量:只有方法,字段,類型和屬性。 – StriplingWarrior 2012-02-07 20:08:30
@StriplingWarrior這確實使問題複雜化了,儘管這可能會解決......絕對不值得解決,因爲我確信他的問題有更好的選擇。 – 2012-02-07 20:19:02
「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
生活中的名字。
如果matrix1_2不在類中,它只是方法中的一個變量? – McKay 2012-02-07 20:47:57
@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
這正是我的觀點他想訪問一個理論上的任意變量,如果它是一個字段,那麼這個代碼就可以工作,如果它是一個屬性,其他代碼就可以工作,如果它是一個參數,其他代碼可以工作,你沒有一個非常普遍的解決方案。 – McKay 2012-02-21 14:50:04
可以以這種方式從一個動態類型(使用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
}
*如果「項目」是在運行時產生的動態類型(但不是必須)和「字段名」是你正在尋找的屬性名稱的字符串。
我認爲你很容易混淆變量的名稱和值。或者我很困惑。 – kenny 2012-02-07 20:04:18
它可能*使用反射,但這通常不是一個好主意。你想實現什麼?可能有更好的方法。 – Blorgbeard 2012-02-07 20:06:02
可能dupe http://stackoverflow.com/questions/4629/c-sharp-eval-equivalent – MikeM 2012-02-07 20:06:44