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

4
我在ActionScript中工作了很久,很高兴看到它与C#非常相似,但有一件事我很想要,那就是“动态引用”。
例如,可以使用数组运算符[]进行动态引用。因此,例如,您也可以通过以下两种方式访问属性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#中的属性?

1
ExpandoObjects将按照Nathan所描述的方式工作,但我认为您的设计可能不了解.net中可用的选项--有许多不同类型的集合,我预计将更快且更优雅。 该使用哪个取决于您要解决的问题--您可以提供更多详细信息吗? - Hogan
Hogan,我正在尝试访问对象属性。Nathan所描述的方法正好符合我目前的需求。谢谢大家。 - IneedHelp
2个回答

6

我所能想到的唯一方法是使用动态语言,尤其是使用 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

C# 中没有 eval

关于你问题的第一部分。在 C# 中,以下操作是完全可行的:

var key = "ouch";
Console.WriteLine(something[key]);

有两件值得一提的事情。

  1. 这段代码没有任何动态性,至少在 C# 中的 dynamic 意义上没有。
  2. something 不是数组,而是字典。

更多信息:如果您访问的成员是 someThing[someVar] 形式,而 someThing 不仅仅是一个数组,在 C# 中被称为索引器 - Jeppe Stig Nielsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接