如何通过名称查找访问对象的属性?

时间:2012-08-05 05:10:46

标签: c# dynamic properties

我在ActionScript中做了很多工作,我很高兴看到它与C#非常相似,但有一件事我没有,那就是"动态引用&#34 ;

例如,可以使用数组运算符[]完成动态引用。因此,您也可以通过以下两种方式访问​​属性some_thing.something_else

some_thing["something_else"]
// or

some_thing[some_var] // where some_var is a variable holding a string
// e.g.: some_var = "something_else";

换句话说,数组语法等同于指定属性本身。

动态引用对象的另一个选项是使用eval()全局函数。

所以,我的问题:是否可以以类似于ActionScript的方式引用C#中的属性?

2 个答案:

答案 0 :(得分:5)

我能看到的唯一方法是使用动态,特别是ExpandoObject。使用ExpandoObject课程,您可以执行以下操作:

dynamic employee;

employee = new ExpandoObject();
employee.Name = "John Smith";
employee.Age = 33;

尽管employee没有任何这些属性,但这段代码将编译并运行。它不仅可以工作,而且动态属性甚至可以强类型化。

按键访问属性也很容易。 ExpandoObject实现IDictionary<string,object>,因此它就像向下转发一样简单:

var dictEmployee = employee as IDictionary<string,object>;
Debug.WriteLine(dictEmployee["Age"].ToString);

此代码将导致33被打印到调试输出中。

我不建议普遍使用这种方法,但它偶尔会派上用场。

答案 1 :(得分:1)

C#中没有eval

关于问题的第一部分。虽然C#

完全可以完成
var key = "ouch";
Console.WriteLine(something[key]);

有两件事值得一提。

  1. 这个代码没有任何动态,至少在动态
  2. 的C#含义中是这样
  3. something不是数组,而是字典。