我可以将ExpandoObject强制转换为匿名类型吗?
var anoObj = new { name = "testName", email = "testEmail" };
dynamic expandoObj = new System.Dynamic.ExpandoObject();
// Here I'm populating the expandoObj with same property names/types in anonymoustype(anoObj)
// Now, how to convert this ExpandoObject to anonymoustype ?
var newObj = (typeof(anoObj)expandoObj); // This doesn't work
Run Code Online (Sandbox Code Playgroud)
//这是我的实体
public class Customer
{
#region Public Properties
[ColumnAttribute(Name = "IdColumn")]
public string Id { get; set; }
[ColumnAttribute(Name = "NameColumn")]
public string Name { get; set; }
[ColumnAttribute(Name = "AddressColumn")] …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种从动态对象中动态删除成员的方法(可能我们可以在这里使用Expando对象吗?).
好的,我想需要一点澄清......
当你这样做:
dynamic foo = new ExpandoObject();
foo.Bar = 42;
foo.Jar = 25;
Run Code Online (Sandbox Code Playgroud)
的Bar,"罐子"属性会在运行时动态添加.我向用户显示这个,他可能会进一步添加自己的属性(表单可用选项),这可以通过添加成员到动态对象来完成.
但他也可以从Foo对象中删除成员(比如'Jar'),我们如何删除成员表单动态对象?我们可以在这里使用Expando对象吗?
我有这个
dynamic d = new ExpandoObject();
d.Name = attribute.QualifiedName.Name;
Run Code Online (Sandbox Code Playgroud)
所以,我知道d会有一个属性Name.现在如果我在编译时不知道属性的名称,我该如何将该属性添加到动态.我发现了这个问题
所以,有一个复杂的调用绑定器等概念......首先很难得到它.这样做的更简单的方法是什么?
我正在尝试创建一个动态的对象列表,因为在我从文件中读取它们之前,我不知道我的对象将具有哪些属性.
所以假设我在数组中有我的对象的属性(例如FirstName,LastName,Email).
我想创建具有上述属性的名为Recipient的动态对象.然后我想创建一个列表并将其中一些对象添加到该列表中.
到目前为止,我已经完成了以下操作,但我不确定这是否是为动态对象分配属性的正确方法("fields"是数组的名称):
var persons = new List<dynamic>();
dynamic Recipient = new ExpandoObject() as IDictionary<string, Object>;
foreach (string property in fields)
{
Recipient.property = string.Empty;
}
Run Code Online (Sandbox Code Playgroud)
如何使用上述属性创建收件人对象,然后将这些收件人添加到人员列表中?
我从驱动程序api(在dll中)获得了一个类型为"密封类"的动态对象.我想用一些额外的属性来装饰这个对象.
我想做一些事情的效果:
public void expandIT(dynamic sealedObject) {
ExpandoObject expand = new ExpandoObject(sealedObject);
expand.time = DateTime.Now();
etc....
}
Run Code Online (Sandbox Code Playgroud)
UPDATE
我喜欢JCL的解决方案.但是对于我想要做的事情,创建一个ExpandoObject然后将Dynamic sealed class对象作为子属性嵌入,然后将我的属性添加到父ExpandoObject更容易.谢谢JCL,我正在大脑冻结如何做到这一点.一世
一个相当简单的问题.我正在开发一个项目,我需要从一种上下文存储中动态存储和检索属性值.这些值将立即写入并多次读取.检索速度是这里的首要任务,每纳秒都很重要.
通常,我只是用一个字典来实现它,但是使用C#4和ExpandoObject,我想也许有更好的方法?有没有人有这方面的经验?我在其他帖子中看到它没有使用字典实现,这使我对它是更快还是更慢感到好奇?
让我试着澄清一些伪代码:
// In the main loop
var context = new Context();
context["MyKey"] = 123;
context["MyOtherKey"] = "CODE";
context["MyList"] = new List<int>() { 1, 12, 14 };
foreach(var handler in handlers) {
handler.DoStuff(context);
}
Run Code Online (Sandbox Code Playgroud)
-
// "Handlers"
class MyFirstHandler {
void DoStuff(Context context) {
if (context["MyKey"] > 100)
context["NewKey"] = "CODE2";
}
}
class MySecondHandler {
void DoStuff(Context context) {
if (context["MyOtherKey"] == "CODE")
context["MyList"].Add(25); // Remember, it's only Pseudo-code..
}
}
Run Code Online (Sandbox Code Playgroud)
好吧,希望你能得到我想要的东西..
我也完全接受其他建议.我一直在想要使Context类静态类型化(即实际上有一个MyKey属性,MyOtherKey属性等),虽然它可能会对我们产生很大的影响.
我尝试向ExpandoObject添加一个动态方法,它将返回属性(动态添加)给它,但它总是给我错误.
我在这里做错了吗?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Dynamic;
namespace DynamicDemo
{
class ExpandoFun
{
public static void Main()
{
Console.WriteLine("Fun with Expandos...");
dynamic student = new ExpandoObject();
student.FirstName = "John";
student.LastName = "Doe";
student.Introduction=new Action(()=>
Console.WriteLine("Hello my name is {0} {1}",this.FirstName,this.LastName);
);
Console.WriteLine(student.FirstName);
student.Introduction();
}
}
}
Run Code Online (Sandbox Code Playgroud)
编译器正在标记以下错误:错误1
关键字"this"在静态属性,静态方法或静态字段初始值设定项中无效
D:\ rnd\GettingStarted\DynamicDemo\ExpandoFun.cs 20 63 DynamicDemo
我需要循环一个List<dynamic>对象.
列表的对象都有值,但由于某种原因,我无法访问任何动态对象字段.下面是我的调试窗口的屏幕截图:

在那里你可以看到对象包含字段(例如Alias,Id,Name等).
我试了两个强制转换为IDictionary<string, object>和ExpandoObject,无济于事.我之前没有遇到过这样的事情:当dynamic对象存在时无法访问对象中的现有字段.
这有什么不对?
代码抛出Microsoft.CSharp.RuntimeBinder.RuntimeBinderException一条消息说明{"'object' does not contain a definition for 'Name'"}.
创建列表添加了匿名类型的对象,如下所示:
return new List<dynamic>(fields.Select(field => new
{
Id = field.Id,
Alias = field.Alias,
Name = field.Name,
Type = field.Type,
Value = field.Value,
SortOrder = field.SortOrder
}));
Run Code Online (Sandbox Code Playgroud)
这里fields是一个ICollection<Field>,一个强类型集合.
我正在使用 C# 并尝试从动态对象生成 JSON 字符串。
dynamic reply = new System.Dynamic.ExpandoObject();
reply.name = "John";
reply.wins = 42;
string json = System.Web.Helpers.Json.Encode(reply);
System.Console.WriteLine(json);
Run Code Online (Sandbox Code Playgroud)
(注意,上面需要对 System.Web.Helpers 程序集的引用。)
我希望这能输出字符串:
{"name":"John","wins":42}
Run Code Online (Sandbox Code Playgroud)
但它实际上输出:
[{"Key":"name","Value":"John"},{"Key":"wins","Value":42}]
Run Code Online (Sandbox Code Playgroud)
我需要更改什么才能获得我希望的输出?
我想看看C#Expando类中是否存在属性.
很像python中的hasattr函数.我想为hasattr提供c#equalant.
像这样的东西......
if (HasAttr(model, "Id"))
{
# Do something with model.Id
}
Run Code Online (Sandbox Code Playgroud)