如何在 C # 中创建自己的动态类型或动态对象?

例如,ControllerBase类的 视图包属性,我们可以动态地获取/设置值并向该对象添加任意数量的额外字段或属性,这很酷。我想使用类似的东西,超越 MVC 应用程序和 Controller类在其他类型的应用程序。当我尝试创建 充满活力对象并像下面这样设置它的属性时:

1. dynamic MyDynamic = new { A="a" };
2. MyDynamic.A = "asd";
3. Console.WriteLine(MyDynamic.A);

第二行是 RuntimeBinderException和消息 属性或索引器“ < > f _ _ Anonymous ousType0.A”不能分配给——它是只读的。而且,我怀疑这不是我想要的。也许有些课程可以让我做这样的事情:

??? MyDynamic = new ???();
MyDynamic.A = "A";
MyDynamic.B = "B";
MyDynamic.C = DateTime.Now;
MyDynamic.TheAnswerToLifeTheUniverseAndEverything = 42;

具有动态添加和设置属性。

313237 次浏览

ExpandoObject是你要找的。

dynamic MyDynamic = new ExpandoObject(); // note, the type MUST be dynamic to use dynamic invoking.
MyDynamic.A = "A";
MyDynamic.B = "B";
MyDynamic.C = "C";
MyDynamic.TheAnswerToLifeTheUniverseAndEverything = 42;
dynamic MyDynamic = new System.Dynamic.ExpandoObject();
MyDynamic.A = "A";
MyDynamic.B = "B";
MyDynamic.C = "C";
MyDynamic.Number = 12;
MyDynamic.MyMethod = new Func<int>(() =>
{
return 55;
});
Console.WriteLine(MyDynamic.MyMethod());

了解更多有关 扩展对象类和更多示例的信息: 表示一个对象,其成员可以在运行时动态添加和删除。

dynamic MyDynamic = new ExpandoObject();

可以使用 System.Dynamic名称空间中的 ExpandoObject Class

dynamic MyDynamic = new ExpandoObject();
MyDynamic.A = "A";
MyDynamic.B = "B";
MyDynamic.C = "C";
MyDynamic.SomeProperty = SomeValue
MyDynamic.number = 10;
MyDynamic.Increment = (Action)(() => { MyDynamic.number++; });

更多有关资料,请浏览 扩展对象 MSDN

我最近需要更进一步,根据用户定义的条目在动态对象中添加属性,即动态本身。这里的示例和来自 微软的扩展对象文档的示例并不专门处理动态添加属性的问题,但是可以从枚举和删除属性的方式中推测出来。不管怎样,我觉得这可能对某人有帮助。下面是一个极其简化的版本,介绍如何向 ExpandObject 添加真正的动态属性(忽略关键字和其他处理) :

// my pretend dataset
List<string> fields = new List<string>();
// my 'columns'
fields.Add("this_thing");
fields.Add("that_thing");
fields.Add("the_other");


dynamic exo = new System.Dynamic.ExpandoObject();


foreach (string field in fields)
{
((IDictionary<String, Object>)exo).Add(field, field + "_data");
}


// output - from Json.Net NuGet package
textBox1.Text = Newtonsoft.Json.JsonConvert.SerializeObject(exo);
dynamic myDynamic = new { PropertyOne = true, PropertyTwo = false};
var data = new { studentId = 1, StudentName = "abc" };

或者价值是存在的

var data = new { studentId, StudentName };