2013-04-30 126 views
1

我正在编写一个包装执行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写这个,所以我的选项非常有限,请记住这一点很合适。

感谢您的帮助。

+0

感谢编辑@DanielHilgarth,我的打字只是所有的地方 – 2013-04-30 14:22:44

+0

类似,非WP:[动态设定一个C#匿名类型的属性名称] (http://stackoverflow.com/questions/1642733/dynamically-set-the-property-name-of-ac-sharp-anonymous-type) – nawfal 2014-07-19 19:15:34

回答

1

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; 
+0

好的,酷会尝试它,谢谢。 – 2013-04-30 13:54:43

+0

错误,你是说假设一个不同的场景,如果我做了obj.SomeProperty =“有些值”;该obj仍然没有任何属性? 我这样做的原因是这样引用不会为空! – 2013-04-30 13:55:56

+0

@ObiOnuorah:的确如此。你只需要一个'RuntimeBinderException':*''<> f__AnonymousType0''不包含'SomeProperty'*的定义。 – 2013-04-30 13:58:44