我正在开发.NET中的反序列化类,我必须开发一个方法,为我提供一个存储在字符串中的变量名。
我有一个字符串,如:
string string_name = "this_is_going_to_be_var_name";
现在我该怎样做才能让我的代码动态声明一个名为this_is_going_to_be_var_name的变量?
所以要清理:将有一个反序列化类,它将根据高级程序员/用户的意愿,声明与作为输入提供的字符串相同的变量及其PARENT TYPES。
例如:在javascript / jQuery中,当我通过发出请求来获取JSON时,解释器声明具有相同名称的变量/数组并为它们赋值。如果{“var_name”:“var_value”}是一个JSON字符串,则解释器将创建一个名为var_name的变量,并为其分配“var_value”,例如json_data_object.var_name。
答案 0 :(得分:5)
不,你不能。 C#变量都是静态声明的。
您可以做的最好的事情是创建一个字典并使用键而不是变量名。
// Replace object with your own type
Dictionary<string, object> myDictionary = new Dictionary<string, object>();
myDictionary.Add("this_is_going_to_be_var_name", value_of_the_variable);
// ...
// This is equivalent to foo($this_is_going_to_be_var_name) in PHP
foo(myDictionary["this_is_going_to_be_var_name"]);
答案 1 :(得分:1)
这是不可能的,变量名在编译时定义,而不是在运行时定义。 一种方法是创建一个字典或散列表来将字符串名称映射到对象,以实现您想要的目标。
答案 2 :(得分:0)
不确定你的意思
我的代码动态声明一个名为的变量 this_is_going_to_be_var_name?
但PHP中explode
所做的.Net版本是Split
:
string[] zz = "this_is_going_to_be_var_name".Split('_');
答案 3 :(得分:0)
我能想到的唯一一件事(我没有测试它,所以我不知道是否可能),是有一个类型为动态的对象,然后尝试使用反射在运行时设置字段和InvokeMember(),我可以给它一个机会,因为没有对动态类型的对象进行验证。
<强>更新强> 我用ExpendoObject测试它并且InvokeMember似乎不起作用(至少没有使用默认的绑定器,但我没有使用DynamicObject测试它,尽管我没有给它很多机会工作你仍然可以尝试它,您可以查看http://msdn.microsoft.com/en-us/library/ee461504.aspx有关如何使用DynamicObject的信息。
看看Dynamically adding properties to an ExpandoObject本质上描述了一个方法,其中动态对象被转换为IDictionary,然后你可以通过使用标准字典访问添加属性,同时它们实际上获取属性对象。
我通过使用ExpendoObject类型的动态对象在示例项目中测试它,然后我添加另一个使用类型IDictionary引用它的变量,然后我尝试在两者上设置和获取属性,如下例所示: / p>
dynamic test = new ExpandoObject();
//reference the object as a dictionary
var asDictinary = test as IDictionary<string, Object>;
//Test by setting it as property and get as a dictionary
test.testObject = 123;
Console.Write("Testing it by getting the value as if it was a dictionary");
Console.WriteLine(asDictinary["testObject"]);
//Test by setting as dictionary and get as a property
//NOTE: the command line input should be "input", or it will fail with an error
Console.Write("Enter the varible name, ");
Console.Write("note that for the example to work it should the word 'input':");
string variableName = Console.ReadLine();
Console.Write("Enter the varible value, it should be an integer: ");
int variableValue = int.Parse(Console.ReadLine());
asDictinary.Add(variableName, variableValue);
Console.WriteLine(test.input);//Provided that the command line input was "input"
(但是在你的情况下,你仍然无法直接在代码中访问属性我不认为需要它,你可能会直接使用一个词典,我不明白为什么你需要它们是对象的属性,只有在编译时想要引用它们时才需要它们。
但也许我误解了你并且你正在寻找一个动态变量而不是动态属性[在PHP中使用$$语法可以使用的东西],如果是这种情况那么请注意在c#中没有变量,因为所有东西都封装在一个对象中。)
您还可以查看How can I dynamically add a field to a class in C#以获取更多答案。