【问题标题】:add attributes via string to dynamic object通过字符串将属性添加到动态对象
【发布时间】:2013-05-24 00:42:54
【问题描述】:

我有以下定义:

public class cell : DynamicObject {

}

[DataContract]
public class rows {
  [DataMember]
   public List<cell> rows;
}

稍后在我做的代码中:

dynamic dtCell = new cell();

我需要能够每次都创建具有不同名称的属性。所以我能够得到像这样的json:

{ color: 'red', category: 'car'} or { country: 'US', city: 'Tampa', county: '...', ... }

如何为动态对象创建属性,就像在 javascript 中向字典添加属性或类似的东西一样。

我试过了:dtCell.GetType().GetProperty('city'),正如我在几个帖子中发现的那样,对象返回是 null

当我这样做时:

dtCell.GetType().GetProperty('city').SetValue(dtCell, 'Tampa', null)

我得到了例外:dtCell.GetType().GetProperty("CustomerId").SetValue(dtCell, 3, null)' threw an exception of type 'System.Reflection.TargetInvocationException' dynamic {System.Reflection.TargetInvocationException}

不胜感激!!!

【问题讨论】:

标签: c# wcf c#-4.0 dynamic reflection


【解决方案1】:

您可以使用 Dictionary 来代替 DynamicObject。例如,

Dictionary<string, string> dict = new Dictionary<string, string>()
{
    {"country","US"},  {"city","Tampa"},  {"county","..."}
};

var json = new JavaScriptSerializer().Serialize(dict);

会给{"country":"US","city":"Tampa","county":"..."}

也可以使用匿名类

var obj = new { color = "red", category = "car" };
var json2 = new JavaScriptSerializer().Serialize(obj);

【讨论】:

  • WCF 不会将此解决方案序列化为 {key:country, value:US}...吗?我尝试过这种方法似乎我必须编写自己的序列化程序......
  • @user1791567 您可以使用JavaScriptSerializerJson.Net 更改WCF 的默认Json 序列化程序。
  • @user1791567 您也可以返回Stream,这意味着您可以使用任何序列化程序,将结果写入 MemoryStream 并返回该流。
  • 如何更改序列化程序?有什么例子吗?
  • @user1791567 搜索IDispatchMessageFormatter
猜你喜欢
  • 1970-01-01
  • 2012-01-12
  • 2011-10-05
  • 2017-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多