Tag: dynamic

在运行时将成员添加到动态对象

我正在探索.NET 4.0中的DynamicObject模型。 应用程序是通过某种text / xml文件描述对象的应用程序,程序必须在读取该文件时创建对象。 使用DynamicObject,我们可以轻松添加成员,因为我们知道成员的名称是先验的。 但是,如果我们甚至不知道要添加的成员的名称呢? 有没有办法让这种动态变化? 例如,假设我需要使用成员’Property1’,’Property2’创建一个对象,使用’PropertyA’创建另一个对象,并使用text / XML文件描述’PropertyB’。 如何根据此信息动态创建对象? 更新我从这篇文章中得到了一些想法: http : //www.codeproject.com/KB/cs/dynamicincsharp.aspx 这个实现允许我做类似以下的事情: dynamic d = new PFDynamicChannel(); PFCouplings c = ((PFChannel)d).Coupling; d.NewProperty = “X”; 我不想使用字典的原因是使用TryGetMember和TrySetMember方法,我可以覆盖,我可以在其中引发对程序至关重要的事件。 这样,我可以inheritance基类(PFChannel),但我也可以动态添加成员。 但是,我的问题是,在运行时之前我不会知道新的属性名称。 而且,我实际上并不认为动态对象允许我动态添加新属性。 如果是这种情况,我如何利用ExpandoObject来提供这种能力呢?

Json.NET通过引用反序列化为动态对象

如何让Json.NET反序列化为动态对象,但仍然可以进行参考分辨率? dynamic d=JsonConvert.DeserializeObject(…)就像 dynamic d=JsonConvert.DeserializeObject(…)返回一个动态对象但它们不解析$ref和$id部分。 (例如, ExpandoObject eo只有eo[“$ref”]=”…” ,并且没有它应该具有的属性,因为它与$id -Object不同 我发现的是我需要合同解析器解析为动态合同 – 只有在我明确告诉Json.NET使用自定义ContractResolver , ExpandoObject才会这样做。 仍然看起来ExpandoObject是用它自己的Converter解析的,它再次失败。 我尝试过inheritance自IDynamicMetaObjectProvider的自定义类,导致无限循环,看起来不是正确的事情。 我实际上期望一些简单的解决方案让ExpandoObject具有参考分辨率。 有帮助吗?

Null-coalescing运算符为动态对象的属性返回null

我最近在使用Json.NET将JSON解析为动态对象时发现了null-coalescing运算符的问题。 假设这是我的动态对象: string json = “{ \”phones\”: { \”personal\”: null }, \”birthday\”: null }”; dynamic d = JsonConvert.DeserializeObject(json); 如果我尝试使用?? 运算符在d的一个字段上,它返回null: string s = “”; s += (d.phones.personal ?? “default”); Console.WriteLine(s + ” ” + s.Length); //outputs 0 但是,如果我将动态属性分配给字符串,那么它可以正常工作: string ss = d.phones.personal; string s = “”; s += (ss ?? “default”); Console.WriteLine(s + ” ” […]

为什么我不能索引到ExpandoObject?

今天在研究C#动态时,有些东西让我感到惊讶(我从未使用过它们,但最近我一直在尝试使用Nancy Web框架)。 我发现我不能这样做: dynamic expando = new ExpandoObject(); expando.name = “John”; Console.WriteLine(expando[“name”]); 最后一行抛出exception: 无法将带有[]的索引应用于“System.Dynamic.ExpandoObject”类型的表达式 我理解错误信息,但我不明白为什么会这样。 我查看了ExpandoObject的文档,它显式地实现了IDictionary ,因此有一个this.[index]方法( MSDN )。 为什么我不能打电话给它? 当然,没有什么可以阻止我手动将ExpandoObject向下转换为字典然后索引到它中,但这种方式无视这一点; 它也没有解释Expando如何能够隐藏其中一个接口的方法。 这里发生了什么?

如何使用DataContext.ExecuteQuery返回的未知类型的对象

因此,随着C#4.0中dynamic关键字的出现,我希望我能找到一个更好的解决方案来解决在选择任意列时处理DataContext.ExecuteQuery返回的类型的问题。 在过去,我创建了一个新类型来保存此类查询的结果,或者使用此SOpost中描述的方法。 所以,既然我能够处理在.NET 4.0下运行的新项目,我就开始尝试使用动态类型以一种不太痛苦的方式完成同样的事情。 所以,我给了这个镜头: var result = _db.ExecuteQuery( “SELECT CustomerID,City FROM Customers”, new object[0] ); foreach( var d in result ) { MessageBox.Show( String.Format( “{0}, {1}”, d.CustomerID, d.City ) ); } 在运行时抛出exception,因为动态对象的属性CustomerID不存在。 所以,由于我在这一点上对动态关键字的体验是零(文章/博客文章或两篇,没有真正的经验),我希望有人在这里可以让我知道我在这里尝试做什么甚至是可能的。 我可能高估了ExecuteQuery背后的“魔法”数量,但我认为这可能是由于在幕后完成的属性映射。 任何帮助深表感谢。

在解析动态对象时,C#是否为var选择了错误的类型?

我使用以下代码将一些Json转换为动态对象。 当我在动态类型的属性上使用DateTime.Parse时,我希望var猜测它的类型是DateTime …而是保持动态。 这不可能是对的,可以吗? 完整的例子如下。 var settings = new JavaScriptSerializer().Deserialize(json); var startDate = DateTime.Parse(settings.startDate); var endDate = DateTime.Parse(settings.endDate); var userId = int.Parse(settings.userId); startDate,endDate和userId都是动态的,这意味着我不能在以后的Lambda表达式中使用它们。 显然,我可以用以下代码修复代码: DateTime startDate = DateTime.Parse(settings.startDate); DateTime endDate = DateTime.Parse(settings.endDate); int userId = int.Parse(settings.userId); ..但似乎编译器正在做出“糟糕的猜测”。 任何人都可以向我解释这个吗? 谢谢

动态对象序列化

我尝试使用BinaryFormatter序列化DynamicObject类,但是: 输出文件太大,不完全是导线友好的 未处理循环引用(序列化时卡住) 由于序列化DynamicObject本身意味着很少,这里是我尝试序列化的类: [Serializable()] class Entity : DynamicObject, ISerializable { IDictionary values = new Dictionary(); public Entity() { } protected Entity(SerializationInfo info, StreamingContext ctx) { string fieldName = string.Empty; object fieldValue = null; foreach (var field in info) { fieldName = field.Name; fieldValue = field.Value; if (string.IsNullOrWhiteSpace(fieldName)) continue; if (fieldValue == null) continue; this.values.Add(fieldName, […]

为什么调用ISet .Contains()编译,但在运行时抛出exception?

请帮我解释一下这个行为: dynamic d = 1; ISet s = new HashSet(); s.Contains(d); 代码编译没有错误/警告,但在最后一行我得到以下exception: Unhandled Exception: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: ‘System.Collections.Generic.ISet’ does not contain a definition for ‘Contains’ at CallSite.Target(Closure , CallSite , ISet`1 , Object ) at System.Dynamic.UpdateDelegates.UpdateAndExecuteVoid2[T0,T1](CallSite site, T0 arg0, T1 arg1) at FormulaToSimulation.Program.Main(String[] args) in 据我所知,这与动态重载分辨率有关,但奇怪的是 (1)如果s的类型是HashSet ,则不会发生exception。 (2)如果我使用非generics接口和接受动态参数的方法,则不会发生exception。 因此,看起来这个问题特别与通用接口有关,但我无法找出导致问题的确切原因。 它是编译器/类型系统中的错误还是合法行为?

C#动态对象初始值设定项不会编译

以下代码对我来说似乎很合理。 它应该创建对象,然后使用动态function让我分配我喜欢的任何属性。 但是编译器说“ExpandoObject不包含Test的定义”。 对此我说,“我知道,这是一个怪胎!” dynamic example = new ExpandoObject { Test = “fail” }; 任何想法为什么csc不允许这样做。 另一种方法是手动将代码扩展为单独的属性分配。 dynamic example = new ExpandoObject(); example.Test = “fail”; 当我有很多要分配的属性时,这很烦人。

是否可以在运行时向EXISTING类添加方法? 为什么或者为什么不?

我想这可能会使用Reflection.Emit, 但是关于SO的类似问题只回答了如何动态创建类/方法,而不是如何更新现有类。 同样,是否可以在运行时删除方法/类? 如果是这样,我想可以删除该类,并使用旧方法和新方法将其添加回来。 提前致谢。 PS我没有这个用途,只是好奇心问题。