【问题标题】:C# dynamic: Assign properties dynamicallyC#动态:动态分配属性
【发布时间】:2014-07-20 03:14:43
【问题描述】:

我正在围绕一些执行 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;  ???
}

我希望这很清楚。我希望这不是不可能的!

附言我正在为 WP7 写这篇文章,所以我的选择非常有限,记住这一点可能会很好。

感谢您的帮助。

【问题讨论】:

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


【解决方案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;

【讨论】:

  • Err,你是说假设不同的情况,如果我做了 obj.SomeProperty = "some value";那个 obj 仍然没有任何属性?我这样做的原因是引用不会为空!
  • @ObiOnuorah:确实。你只会得到一个RuntimeBinderException'&lt;&gt;f__AnonymousType0'不包含'SomeProperty'的定义
  • @ObiOnuorah:你想在这里实现什么目标?
  • 另外,您的回答似乎假设 obj 已经有一个名为 col[i] 的属性,因此不需要动态对象。我尝试使用 ExpandoObject,但是当我将 System.Dynamic 添加到我的引用中时,我没有得到这种类型......有什么想法吗?
  • 就像问题说的那样,我正在为数据提供者编写一个包装器。我希望消费者能够给我一个带有列的 sql select 语句,并返回一个对象集合,其属性与所查询的列名匹配。
猜你喜欢
  • 1970-01-01
  • 2021-05-31
  • 1970-01-01
  • 2016-08-25
  • 1970-01-01
  • 2020-12-05
  • 2021-12-10
  • 1970-01-01
  • 2013-06-16
相关资源
最近更新 更多