Tag: expandoobject

通过JSON.NET到ExpandoObject的JSON数组

我使用以下方法将我的大多数API JSON结果转换为对象: public void ExpandoObject() { var sampleDATA = Sample.Create(); var json = JsonConvert.SerializeObject(sampleDATA); var expConverter = new ExpandoObjectConverter(); dynamic obj = JsonConvert.DeserializeObject(json, expConverter); var a = obj.A; var b = obj.B; var c = obj.C; //and so on… } 但是,我遇到了这种JSON格式的奇怪情况…… [ { “id”: 42, “name”: “example name”, “member_count”: 42, “created_date”: “example created_date”, “last_update”: “example […]

使用LINQ,是否可以从Select语句输出动态对象? 如果是这样,怎么样?

目前在LINQ中,以下编译和工作正常: var listOfFoo = myData.Select(x => new FooModel{ someProperty = x.prop1, someOtherProperty = x.prop2 }); public class FooModel{ public string someProperty { get; set; }; public string someOtherProperty { get; set; }; } 但是,过去几个版本的.NET / C#扩展了动态对象的作用,比如ExpandoObject ,我想知道是否有办法基本上这样做: var listOfFoo = myData.Select(x => new ExpandoObject{ someProperty = x.prop1, someOtherProperty = x.prop2 }); 显然,我已经尝试过上面的代码没有成功,但似乎我错过了一些东西。

是否可以查询ExpandoObject列表?

我想知道是否可以使用常规LINQ查询ExpandoObject? 原因是我有动态ExpandoObject但我需要先进行一些查询才能进一步传递。 它有一些属性,总是保持例如Id , Notes但也有一些我无法控制的动态属性。 这是我的列表看起来像 [ { “Id”: 1, “FileId”: 1, “Notes”: “”, “1”: “12.02.1991” }, { “Id”: 2, “FileId”: 2, “Notes”: “”, “1”: “12.02.1991” } ] 码 正如您所看到的,我有静态项目,然后确保每个项目动态键都成为该项目属性。 在这个例子中, 1是关键, 12.02.1991是值 var generatedItems = new List(); foreach (var item in items) { var modifiedItem = new List<KeyValuePair> { new KeyValuePair(“Id”, item.Id), new KeyValuePair(“FileId”, […]

如何将ExpandoObject的字典设置为不区分大小写?

给出下面的代码 dynamic e = new ExpandoObject(); var d = e as IDictionary; for (int i = 0; i < rdr.FieldCount; i++) d.Add(rdr.GetName(i), DBNull.Value.Equals(rdr[i]) ? null : rdr[i]); 有没有办法让它不区分大小写,所以给定字段名称employee_name e.Employee_name与e.employee_name一样有效 似乎没有一个明显的方式,也许是一个黑客?

如何使用ServiceStack JsonSerializer序列化ExpandoObject?

是否有可能让ServiceStack JsonSerializer将ExpandoObject序列化为平面对象而不是字典? 大致与此近似的东西: {“x”:”xvalue”,”y”:”\/Date(1313966045485)\/”} 我试图使用三个不同的系统比较ExpandoObject JSON序列化:.NET BCL JavaScriptSerializer,Newtonsoft JSON.NET和ServiceStack的JSON产品。 我从一个相当简单的动态对象开始。 dynamic test = new ExpandoObject(); test.x = “xvalue”; test.y = DateTime.Now; 对于序列化程序来说,将ExpandoObject视为IDictionary似乎更简单。 BCL和ServiceStack都以这种方式开始,但结果与路径完全不同。 JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer(); Console.WriteLine(javaScriptSerializer.Serialize(test)); // [{“Key”:”x”,”Value”:”xvalue”},{“Key”:”y”,”Value”:”\/Date(1313966045485)\/”}] Console.WriteLine(ServiceStack.Text.JsonSerializer.SerializeToString(test)); // [“[x, xvalue]”,”[y, 8/21/2011 16:59:34 PM]”] 我更喜欢将ExpandoObject序列化更多,因为它是在代码中组装的,就像典型的类会被序列化一样。 您可以为IDictionary的BCL系统添加覆盖JavaScript序列化程序 。 这很好用,假设一个实际上没有IDictionary需要保持这种方式(我还没有)。 JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer(); javaScriptSerializer.RegisterConverters(new JavaScriptConverter[] { new ExpandoJsonConverter() }); Console.WriteLine(javaScriptSerializer.Serialize(test)); // […]

C#深度/嵌套/递归合并dynamic / expando对象

我需要在C#中“合并”2个动态对象。 我在stackexchange上发现的所有内容都只包含了非递归合并。 但我正在寻找一些递归或深度合并的东西,就像jQuery的$.extend(obj1, obj2)函数一样。 两名成员发生碰撞后,应遵守以下规则: 如果类型不匹配,则必须抛出exception并中止合并。 例外:obj2值可能为null,在这种情况下使用obj1的值和类型。 对于普通类型(值类型+字符串),总是首选obj1值 对于非平凡类型,应用以下规则: IEnumerable和IEnumberables简单合并(也许.Concat() ?) IDictionary和IDictionary合并; obj1键在碰撞时具有优先权 必须以递归方式合并Expando和Expando[]类型,而Expando []将始终只具有相同类型的元素 可以假设集合中没有Expando对象(IEnumerabe&IDictionary) 可以丢弃所有其他类型,并且不需要在生成的动态对象中存在 以下是可能合并的示例: dynamic DefaultConfig = new { BlacklistedDomains = new string[] { “domain1.com” }, ExternalConfigFile = “blacklist.txt”, UseSockets = new[] { new { IP = “127.0.0.1”, Port = “80”}, new { IP = “127.0.0.2”, Port = “8080” } } […]

List 元素有字段但我无法访问它们。 为什么?

我需要遍历List对象。 列表的对象都有值,但由于某种原因,我无法访问任何动态对象字段。 下面是我的调试窗口的屏幕截图: 在那里你可以看到对象包含字段(例如Alias , Id , Name等)。 我尝试将它转换为IDictionary和ExpandoObject ,但无济于事。 我之前没有遇到过这样的事情: 当 dynamic对象存在时无法访问现有字段。 这有什么不对? 该代码抛出一个Microsoft.CSharp.RuntimeBinder.RuntimeBinderException并显示一条消息,指出{“‘object’ does not contain a definition for ‘Name'”}. 创建列表时添加了匿名类型的对象,如下所示: return new List(fields.Select(field => new { Id = field.Id, Alias = field.Alias, Name = field.Name, Type = field.Type, Value = field.Value, SortOrder = field.SortOrder })); 其中fields是ICollection ,一个强类型集合。

如何在ExpandoObject中使用集合初始化程序语法?

我注意到新的ExpandoObject实现了IDictionary ,它具有必需的IEnumerable<KeyValuePair>和Add(string, object)方法,所以应该可以使用集合初始化语法来添加expando对象的属性与向字典中添加项目的方式相同。 Dictionary dict = new Dictionary() { { “Hello”, “World” } }; dynamic obj = new ExpandoObject() { { “foo”, “hello” }, { “bar”, 42 }, { “baz”, new object() } }; int value = obj.bar; 但似乎没有办法做到这一点。 错误: ‘System.Dynamic.ExpandoObject’不包含’添加’的定义 我认为这不起作用,因为接口是明确实现的。 但有没有办法解决这个问题? 这工作正常, IDictionary exdict = new ExpandoObject() as IDictionary(); exdict.Add(“foo”, “hello”); exdict.Add(“bar”, 42); […]

将属性添加到ExpandoObject,其名称与字符串相同

有没有办法将属性添加到与字符串值同名的ExpandoObject? 例如,如果我有: string propName = “ProductNumber”; dynamic obj = new System.Dynamic.ExpandoObject(); 我可以创建属性ProductNumber,如: obj.ProductNumber = 123; 但是,我可以根据字符串propName创建属性obj.ProductNumber吗? 所以,如果我不知道该属性的名称将是什么,我可以根据此输入创建它。 如果使用ExpandoObject无法做到这一点,那么我应该研究C#的其他任何领域?

C# – 动态添加对象(添加动态属性名称)

我正在尝试创建一些动态的ExpandoObject 。 我遇到了一个问题。 由于我不知道我的对象中这些不同属性的名称应该是什么,我不能这样做: var list = new ArrayList(); var obj = new ExpandoObject(); obj.ID = 1, obj.Product = “Pie”, obj.Days = 1, obj.QTY = 65 list.Add(obj); 让我解释一下我的情况:我希望从随机数据库中获取数据(我不知道哪个,但是根据我从UI获得的信息构建连接字符串),因此我不知道需要获取哪些数据。 这可能是数据库表的一个例子 表销售 ID:int, 产品:nvarchar(100), 天:int, 数量:bigint 这可能是另一个例子: 表Foobar Id:int, 天:int 数量:bigint Product_Id:int Department_Id:int 如您所见,我不知道数据库的外观(这是100%匿名,因此它需要100%动态),我想要返回的数据应该看起来像一个构造良好的JSON,如下所示: [ { “ID”: 1, “Product”: “Pie” “Days”: 1, “QTY”: 65 }, { “ID”: […]