通过名称访问动态对象属性

7
我创建了一个动态对象,我想通过名称访问属性:
dynamic obj = new ExpandoObject();
obj.Name = "Reza";

What I want is

obj["Name"] = "Reza";

或者

var name = obj["Name"];

我该如何做到这一点?


3
ExpandoObject,而不是 ExapnadoObject - Eser
1
只需将其转换为 IDictionary<string, object> - Yacoub Massad
3个回答

9

查看ExpandoObject的定义:

public sealed class ExpandoObject : IDynamicMetaObjectProvider, 
IDictionary<string, object>, ICollection<KeyValuePair<string, object>>, 
IEnumerable<KeyValuePair<string, object>>, IEnumerable, INotifyPropertyChanged

正如您所看到的,该类实现的接口之一是IDictionary<string, object>。因此,您可以这样做:

var dict = (IDictionary<string, object>)obj;
dict["Name"] = "Reza";
var name = dict["Name"] as string;

请注意,如果您只需要访问元素的字典样式行为,则无需使用ExpandoObject;普通的Dictionary<string,object>就可以胜任。

我想知道为什么IDictionary被显式地实现了。如果没有这个,调用会更加简洁。 - nawfal

3
< p >ExpandoObject 实现了 IDictionary<string, object> 接口,这使你可以像这样做:

dynamic obj = new ExpandoObject();

IDictionary<string, object> dictionary = obj;

dictionary["Name"] = "Reza";

var name = dictionary["Name"];

虽然你的答案也是正确的,但dasblinkenlight更加详细,我会点赞并接受他的回答 ;) - Reza

2

TryGetValue 是由 IDictionary 提供的非常方便的方法。

dynamic obj = new ExpandoObject();
IDictionary<string, object> dictionary = obj;
dictionary["Name"] = "Reza";
dict.TryGetValue("Name", out object name);

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