C#动态:动态分配属性
我正在编写一个包装执行sql语句并返回结果的数据库的包装。C#动态:动态分配属性
ExecuteQuery
命令最好返回IEnumerable<T>
,具体取决于查询结果映射到的对象类型。问题是,我不知道这将是什么类型,因此我宁愿返回一个IEnumerable<dynamic>
类型。
这是迄今为止都很好,除了我希望动态对象属性与被查询的列相同,但我无法找到分配这个,我目前有一个数组中的所有列名col []例如
dynamic obj = new {} as dynamic;
for(int i = 0; i < col.Length; i++){
//say col[i] == 'id', I want obj.id = someValue
obj.? = someValue; ???
}
我希望这很清楚。我希望这不是不可能的!
p.s.我正在为WP7写这个,所以我的选项非常有限,请记住这一点很合适。
感谢您的帮助。
dynamic
不适用于您的情况。当您知道编译时间的属性名称时使用dynamic
,但不是该属性将在其上定义的实际类型。
如果您知道属性的名字只在运行时,你将不得不使用普通的反射,这样的事情:
obj.GetType()
.GetProperty(col[i])
.SetValue(obj, someValue);
请注意,dynamic obj = new {} as dynamic;
使得完全没有意义的。这将创建一个没有任何属性的匿名类型。将它赋值给dynamic
变量不会改变它没有的事实,也决不会改变任何属性。
如果您尝试动态地将属性添加到对象,您可能需要使用ExpandoObject
。
用法是这样的:
IDictionary<string, object> obj = new ExpandoObject();
for(int i = 0; i < col.Length; i++)
{
obj.Add(col[i], someValue);
}
return (dynamic)obj;
好的,酷会尝试它,谢谢。 – 2013-04-30 13:54:43
错误,你是说假设一个不同的场景,如果我做了obj.SomeProperty =“有些值”;该obj仍然没有任何属性? 我这样做的原因是这样引用不会为空! – 2013-04-30 13:55:56
@ObiOnuorah:的确如此。你只需要一个'RuntimeBinderException':*'' f__AnonymousType0''不包含'SomeProperty'*的定义。 – 2013-04-30 13:58:44
感谢编辑@DanielHilgarth,我的打字只是所有的地方 – 2013-04-30 14:22:44
类似,非WP:[动态设定一个C#匿名类型的属性名称] (http://stackoverflow.com/questions/1642733/dynamically-set-the-property-name-of-ac-sharp-anonymous-type) – nawfal 2014-07-19 19:15:34