问题不在于代码,问题是你显然无法从即时窗口评估动态对象.
我正试图解决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)
有人知道怎么做吗?
如何在开销最小的.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表达式.
我有一个名为products的expando对象的简单列表.
我在运行时向这些对象添加各种字段(例如颜色或大小)
如何根据动态字段在此列表上编写LINQ查询?
使用经典的对象列表,我可以编写如下的LINQ查询:
From item in Products Where item.color="red" select item
Run Code Online (Sandbox Code Playgroud)
但是对于expandos,如何实现这一点,知道我事先并不知道字段的名称(它可能是重量或其他任何东西)?
先感谢您.
是否有可能让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) 我需要输入将动态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) 我有一个类似的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)
但它没有给出结果.
有人可以帮助我得到结果吗?
提前致谢.
我有一个继承的.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) 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)你可以看到它.:-)
我有一些代码可以与由数据库调用填充的 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) 可用于为动态对象创建属性的字符类型是否有任何限制?
是否有我不能使用的字符列表(例如 /* @)?
expandoobject ×10
c# ×8
dynamic ×4
.net ×3
c#-4.0 ×2
json ×2
.net-3.5 ×1
.net-4.0 ×1
converter ×1
linq ×1
memory-leaks ×1
runtime ×1
servicestack ×1