名称使用字符串变量.NET
我正在研究.NET中的反序列化类,我必须开发一种方法,向我提供存储在字符串中的变量名称。名称使用字符串变量.NET
我有一个字符串,如:
string string_name = "this_is_going_to_be_var_name";
现在我能做些什么让我的代码动态声明一个名为this_is_going_to_be_var_name变量?
所以清除一些事情:将会有一个反序列化类,它会根据高级编程器/用户的愿望声明与作为输入提供的字符串相同名称的变量,并使用它们的父类型。
例如:在javascript/jQuery中,当我通过发出请求获取JSON时,解释器声明同名的变量/数组并为它们赋值。如果{“var_name”:“var_value”}是一个JSON字符串,则解释器将创建一个名为var_name的变量,并为其指定“var_value”,比如json_data_object.var_name。
不,你不能。 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"]);
这个字典如何在数组中的数组的情况下帮助。我们不确定阵列的尺寸。 @forcey – 2012-08-09 17:28:12
'object'可以容纳任何东西,包括数组的数组。如果你希望它看起来更像PHP,你可以用'dynamic'替换'object'。 – 2012-08-09 17:29:53
我明白你需要什么并回答你的问题并不意味着我会认为这是一个好问题。下次试试问好:-) – 2012-08-09 17:44:04
不知道你的
我的代码意思动态声明一个名为 this_is_going_to_be_var_name变量?
但什么explode
确实在PHP .NET版本为Split
:
string[] zz = "this_is_going_to_be_var_name".Split('_');
这是不可能的,变量名是在编译时定义,而不是运行时间。 一种方法是创建一个字典或散列表,将字符串名称映射到对象以达到您想要的效果。
我现在可以考虑的唯一一件事(我没有测试过,所以我没有线索,如果可能的话)是有一个动态类型的对象,然后尝试在运行时使用设置字段反射和InvokeMember(),我可以给它一个机会,因为它没有对动态类型的对象进行验证。
UPDATE: 我与ExpendoObject和InvokeMember测试,它似乎并没有工作(至少不使用默认的粘合剂,但我还没有DynamicObject测试它和allthough我不把它给太多的机会工作,你可能还是试试吧,你可以看看如何使用DynamicObject http://msdn.microsoft.com/en-us/library/ee461504.aspx。
就以Dynamically adding 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"
(但是仍然在你的情况,因为你无论如何不能直接访问代码的属性我没有看到它的需要,你可能将能够直接使用字典,我不理解为什么你需要它们作为对象的属性,这只有在编译时需要引用它们时才需要。
但也许我误解了你,你正在寻找一个动态变量而不是动态属性[在PHP中使用$$语法可用的东西],如果是这种情况,那么请注意,在C#中没有变量所有东西都封装在一个对象中)。
您还可以在How can I dynamically add a field to a class in C#查看更多的答案。
你需要扩大这一点,我也相信反射可能是解决这个难题的一部分,但是我再也不知道。 @yohal – 2012-08-09 23:41:51
查看动态类型和反射InvokeMember方法,我所建议的是,也许你可以在非存在的成员上动态使用InvokeMember类型,虽然我没有给出太多的机会,它仍然可以工作,但我还没有一个机会来测试它,所以如果你想要的话,你至少可以试试 – 2012-08-10 00:08:54
ok,我会研究它。 @yohal – 2012-08-10 00:12:13
我不明白,在PHP中爆炸只是将字符串拆分成由分隔符分隔的部分,这与用相同名称声明变量无关。 – 2012-08-09 16:54:49
从什么反序列化?也许你正在建设的功能已经存在? – 2012-08-09 16:58:05
我想我在那里有点困惑,不,我不是意味着爆炸,我的意思是别的,等等让我编辑它,所以我可以更好地解释自己。 @MystereMan – 2012-08-09 17:15:11