标签: expandoobject

向ExpandoObjects添加方法

UPDATE

问题不在于代码,问题是你显然无法从即时窗口评估动态对象.


我正试图解决ExpandoObject的方法,但不知道如何让它工作.这是我的代码:

dynamic myObj = new ExpandoObject();
myObj.First = "Micah";
myObj.Last = "Martin";
myObj.AsString = new Func<string>(() => myObj.First + " " + myObj.Last);

//No matter what I do I get 'object' does not contain a definition for 'AsString'
myObj.AsString;
myObj.AsString();
myObj.AsString.Invoke();
Run Code Online (Sandbox Code Playgroud)

有人知道怎么做吗?

c# dynamic .net-4.0 expandoobject

6
推荐指数
1
解决办法
2950
查看次数

.NET 3.5中ExpandoObject的替代品,开销最小

如何在开销最小的.NET 3.5应用程序中模仿ExpandoObject的功能?到目前为止,我最好的领导是使用Lin Fu框架(http://www.codeproject.com/KB/cs/LinFuPart2.aspx),但我认为可能会有更好的东西.

为了更好地了解我的目标,我的目标是从a的参数动态创建类型MethodInfo.所以,基本上我想转此:

    public class ServiceObject
    {
        public void Execute(string TransformMeIntoAProperty);
    }
Run Code Online (Sandbox Code Playgroud)

    public class ServiceObjectExecuteSignature
    {
        public string TransformMeIntoAProperty{ get; set;}
    }
Run Code Online (Sandbox Code Playgroud)

在运行时.我必须能够使用Reflection访问参数,因为我使用的是Linq表达式.

c# runtime dynamic .net-3.5 expandoobject

6
推荐指数
1
解决办法
2174
查看次数

.net expando对象和LINQ.可能与否?

我有一个名为products的expando对象的简单列表.

我在运行时向这些对象添加各种字段(例如颜色或大小)

如何根据动态字段在此列表上编写LINQ查询?

使用经典的对象列表,我可以编写如下的LINQ查询:

From item in Products Where item.color="red" select item
Run Code Online (Sandbox Code Playgroud)

但是对于expandos,如何实现这一点,知道我事先并不知道字段的名称(它可能是重量或其他任何东西)?

先感谢您.

.net linq expandoobject

6
推荐指数
1
解决办法
2513
查看次数

如何使用ServiceStack JsonSerializer序列化ExpandoObject?

是否有可能让ServiceStack JsonSerializer将ExpandoObject序列化为扁平对象而不是字典?大致与此近似的东西:

{"x":"xvalue","y":"\/Date(1313966045485)\/"}
Run Code Online (Sandbox Code Playgroud)

我试图比较ExpandoObject使用三种不同系统的JSON序列化:.NET BCL JavaScriptSerializer,Newtonsoft JSON.NET和ServiceStack的JSON产品.

我从一个相当简单的动态对象开始.

dynamic test = new ExpandoObject();
test.x = "xvalue";
test.y = DateTime.Now;
Run Code Online (Sandbox Code Playgroud)

对于序列化程序来说,将ExpandoObject视为一个似乎更简单IDictionary<string, object>.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]"]
Run Code Online (Sandbox Code Playgroud)

我更喜欢将ExpandoObject序列化更多,因为它是在代码中组装的,就像典型的类会被序列化一样.您可以将覆盖JavaScript序列化IDictionary<string, object>程序添加到BCL系统中.这很有效,假设一个人实际上并不IDictionary<string, object>需要保持那种方式(我还没有).

JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer();
javaScriptSerializer.RegisterConverters(new JavaScriptConverter[] { new ExpandoJsonConverter() });
Console.WriteLine(javaScriptSerializer.Serialize(test));
// {"x":"xvalue","y":"\/Date(1313966045485)\/"}
Run Code Online (Sandbox Code Playgroud)

不幸的是,我仍然需要一种让ServiceStack的JsonSerializer以同样的方式处理ExpandoObject的方法.如何挂钩ServiceStack系统以实现这一目标?

更新:虽然它不是我使用的选项,但看起来ServiceStack处理匿名对象就好了.

Console.WriteLine(ServiceStack.Text.JsonSerializer.SerializeToString(new { x = "xvalue", y = DateTime.Now }));
// {"x":"xvalue","y":"\/Date(1313980029620+0000)\/"}
Run Code Online (Sandbox Code Playgroud)

c# json expandoobject servicestack

6
推荐指数
1
解决办法
3008
查看次数

从动态xml转换为c#对象

我需要输入将动态xml转换为定义的c#对象模型

我的样本xml如下:

<?xml version="1.0" encoding="utf-8" ?>
  <Persons>
    <Person>
      <Id>10</Id>
      <FirstName> Dino </FirstName>
      <LastName> Esposito </LastName>
      <Addresses>
        <Address>
          <AddressType>BillTo</AddressType>
          <Street1></Street1>
          <Street2></Street2>
          <Street3></Street3>
          <City>Moscow</City>
        </Address>
        <Address>
          <AddressType>ShipTo</AddressType>
          <Street1></Street1>
          <Street2></Street2>
          <Street3></Street3>
          <City>Moscow</City>
        </Address>
        <Address>
          <AddressType>Contact</AddressType>
          <Street1></Street1>
          <Street2></Street2>
          <Street3></Street3>
          <City>Moscow</City>
        </Address>
      </Addresses>
    </Person>
  </Persons>
Run Code Online (Sandbox Code Playgroud)

我希望在运行时将此xml的值转换为C#对象.我希望定义一个类似于下面的对象:我的预期类对象C#如下:

public class Person
{
    public int Id { get; set; }
    public String FirstName { get; set; }
    public String LastName { get; set; }
    public IList<Address> Addresses { get; set; }
}

public class Address
{
    public string …
Run Code Online (Sandbox Code Playgroud)

.net c# dynamic expandoobject c#-4.0

6
推荐指数
2
解决办法
2万
查看次数

在c#中从JSON对象转换为expando对象

我有一个类似的JSON对象

var jsonObject = {"att1" : "val1","att2" : "val2","att3" : "val3","att4" : "val4"}

我需要将它转换为expandoObject

我试过类似的东西

var expConverter = new ExpandoObjectConverter();
dynamic obj = JsonConvert.DeserializeObject<List<ExpandoObject>>(jsonObject, expConverter);
Run Code Online (Sandbox Code Playgroud)

但它没有给出结果.

有人可以帮助我得到结果吗?

提前致谢.

c# json converter expandoobject

6
推荐指数
1
解决办法
7359
查看次数

.NET4 ExpandoObject使用泄漏内存

我有一个继承的.NET 4.0应用程序作为Windows服务运行.我不是任何一个.NET专家,但在编写代码30多年后,我知道如何找到自己的方式.

当服务首次启动时,它会在大约70MB的私人工作集上进行计时.服务运行的时间越长,所需的内存就越多.这种增加并不是那么引人注目,只是坐着观看,但我们已经看到在应用程序运行了很长时间(100天以上)之后的情况,它达到了多GB(当前记录为5GB).我将ANTS Memory Profiler附加到正在运行的实例上,发现ExpandoObject的使用似乎占用了几兆字节的字符串,这些字符串不会被GC清理掉.可能还有其他泄漏,但这是最明显的,所以它首先受到攻击.

我从其他SO帖子中了解到,当读取(但不是写入)动态分配的属性时,ExpandoObject的"正常"使用会生成内部RuntimeBinderException.

dynamic foo = new ExpandoObject();
var s;
foo.NewProp = "bar"; // no exception
s = foo.NewProp;     // RuntimeBinderException, but handled by .NET, s now == "bar"
Run Code Online (Sandbox Code Playgroud)

你可以在VisualStudio中看到异常,但最终它是在.NET内部处理的,你得到的就是你想要的值.

除了...异常的Message属性中的字符串似乎保留在堆上,并且永远不会收到Garbage Collected,即使在生成它的ExpandoObject超出范围之后很久.

简单的例子:

using System;
using System.Dynamic;

namespace ConsoleApplication2
{
   class Program
   {
      public static string foocall()
      {
         string str = "", str2 = "", str3 = "";
         object bar = new ExpandoObject();
         dynamic foo = bar;
         foo.SomePropName = "a test value";
         // each of the following …
Run Code Online (Sandbox Code Playgroud)

.net memory-leaks expandoobject

6
推荐指数
1
解决办法
924
查看次数

ExpandoObject中的List

dynamic model = new ExpandoObject();
model.Data = "asdf";

List<dynamic> listOfx = new List<dynamic>();
for (int i = 0; i < 3; i++) {
    dynamic x = new ExpandoObject();
    x.ID = i;
    x.Name = "test" + i.ToString();
    listOfx.Add(x);
}
model.listOfx = listOfx;
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我可以在模型内部看到数据,但不能看到listOfx.

问题:如何在ExpandoObject中获取列表(或IEnumerable)

更新解决方案: 在此输入图像描述

因为我无法在本地窗口看到lifOfx,所以我觉得它不起作用.在这里(通过y)你可以看到它.:-)

c# expandoobject

5
推荐指数
1
解决办法
9361
查看次数

ExpandoObjects 的动态视图“隐藏”具有空值的属性

我有一些代码可以与由数据库调用填充的 ExpandoObjects 一起使用。总是有些值是空值。当我将对象视为 ExpandoObject 时,我会看到底层字典中的所有键和值(包括空值)。但是,如果我尝试通过动态引用访问它们,则任何具有相应空值的键都不会显示在对象的动态视图中。当我尝试通过动态引用上的属性语法访问它时,我得到一个 ArgumentNullException。

我知道我可以通过直接使用 ExpandoObject、添加一堆尝试捕获、将 expando 映射到具体类型等来解决这个问题,但这首先违背了拥有这个动态对象的目的。如果某些属性具有空值,则使用动态对象的代码将正常工作。是否有更优雅或更简洁的方式来“取消隐藏”这些具有空值的动态属性?

这是演示我的“问题”的代码

dynamic dynamicRef = new ExpandoObject();
ExpandoObject expandoRef = dynamicRef;

dynamicRef.SimpleProperty = "SomeString";
dynamicRef.NulledProperty = null;

string someString1 = string.Format("{0}", dynamicRef.SimpleProperty);

// My bad; this throws because the value is actually null, not because it isn't
// present.  Set a breakppoint and look at the quickwatch on the dynamicRef vs.
// the expandoRef to see why I let myself be led astray.  NulledProperty does not
// show up in the …
Run Code Online (Sandbox Code Playgroud)

c# dynamic expandoobject

5
推荐指数
1
解决办法
3350
查看次数

动态对象的特殊字符?

可用于为动态对象创建属性的字符类型是否有任何限制?

是否有我不能使用的字符列表(例如 /* @)?

c# expandoobject c#-4.0

5
推荐指数
1
解决办法
2392
查看次数