C#dynamic:动态分配属性

时间:2013-04-30 13:49:10

标签: windows-phone-7 c#-4.0 dynamic-keyword

我正在编写一个执行sql语句并返回结果的数据库的包装器。

理想情况下,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写这个,所以我的选择受到严格限制,记住这一点可能会很好。

谢谢你的帮助。

1 个答案:

答案 0 :(得分: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;