-4

I'm working on a deserialization class in .NET, I have to develop a method that provides to me with a variable name that is stored in a string.

I have a string such as:

string string_name = "this_is_going_to_be_var_name";

Now what can I do so that my code dynamically declares a variable named this_is_going_to_be_var_name?

So to clear things up: There will be a deserialization class that will declare variables of the same names as strings provided as input with their PARENT TYPES as per wish of the Higher Level Programmer/User.

For Example: In javascript/jQuery, when I fetch JSON by making a request, the interpreter declares variable(s)/array(s) of the same name and assigns values to them. If {"var_name":"var_value"} is a JSON string, the interpreter will create a variable named var_name and will assign "var_value" to it such as json_data_object.var_name.

4

4 回答 4

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"]); 
于 2012-08-09T16:53:38.553 回答
1

这是不可能的,变量名是在编译时定义的,而不是在运行时定义的。一种方法是创建一个字典或哈希表来将字符串名称映射到对象,以实现您想要的。

于 2012-08-09T16:54:06.797 回答
0

不知道你的意思

我的代码动态声明了一个名为 this_is_going_to_be_var_name 的变量?

但是explodePHP中的.Net版本是Split

string[] zz = "this_is_going_to_be_var_name".Split('_');
于 2012-08-09T16:53:39.610 回答
0

我目前唯一能想到的(我没有测试过,所以我不知道是否可能),是拥有一个动态类型的对象,然后尝试在运行时使用反射和 InvokeMember 设置字段( ),我可以给它一个工作的机会,因为没有对动态类型的对象进行验证。

更新: 我已经使用 ExpendoObject 对其进行了测试,但 InvokeMember 似乎无法正常工作(至少没有使用默认活页夹,但我没有使用 DynamicObject 对其进行测试,尽管我没有给它太多工作机会,但你可能仍然试试看,您可以查看http://msdn.microsoft.com/en-us/library/ee461504.aspx了解如何使用 DynamicObject。

看一下Dynamically added properties to an ExpandoObject它本质上描述了一种方法,其中动态对象被转换为 IDictionary,然后您可以通过使用标准字典访问向它添加属性,而它们实际上正在获取对象的属性.

我在一个示例项目中通过使用 ExpendoObject 类型的动态对象对其进行了测试,然后我添加了另一个使用 IDictionary 类型引用它的变量,然后我尝试在两者上设置和获取属性,如下例所示:

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"

(但在您的情况下,因为无论如何您都不会直接在代码中访问属性,所以我认为不需要它,您可能可以直接使用 Dictionary,我不明白您为什么需要它们对象的属性,仅当您想在编译时引用它们时才需要。

但也许我误解了你,你正在寻找一个动态变量而不是一个动态属性[在 PHP 中使用 $$ 语法可用的东西],如果是这种情况,那么请注意在 c# 中根本没有变量因为一切都封装在一个对象中)。

您还可以查看如何在 C# 中动态地将字段添加到类中以获得更多答案。

于 2012-08-09T23:30:49.373 回答