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

Dmy*_*tro 122 c# dynamic viewbag

在那里,例如,类的ViewBag属性,ControllerBase我们可以动态获取/设置值并向该对象添加任意数量的附加字段或属性,这很酷.我想使用类似的东西,超出MVC应用程序和Controller其他类应用类型.当我尝试创建动态对象并设置它的属性如下所示:

1. dynamic MyDynamic = new { A="a" };
2. MyDynamic.A = "asd";
3. Console.WriteLine(MyDynamic.A);
Run Code Online (Sandbox Code Playgroud)

我有RuntimeBinderException消息属性或索引器'<> f__AnonymousType0.A'无法分配 - 它只在第2行读取.另外我建议它不是我正在寻找的.也许有些课程可以让我做一些像:

??? MyDynamic = new ???();
MyDynamic.A = "A";
MyDynamic.B = "B";
MyDynamic.C = DateTime.Now;
MyDynamic.TheAnswerToLifeTheUniverseAndEverything = 42;
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*num 260

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());
Run Code Online (Sandbox Code Playgroud)

阅读有关ExpandoObject类的更多信息以及更多示例:表示一个对象,其成员可以在运行时动态添加和删除.

  • 请在Visual Studio [UserVoice](https://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/7062098-support-object-initializers-on-expandoobjects)中投票支持此功能. (3认同)

not*_*row 32

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;
Run Code Online (Sandbox Code Playgroud)


Ali*_*mCA 29

我最近需要更进一步,这是根据用户定义的条目,在动态对象中添加属性,动态自己.此处的示例以及Microsoft的ExpandoObject文档中的示例并未专门针对动态添加属性,但可以通过枚举和删除属性的方式进行推测.无论如何,我认为这可能对某人有所帮助.以下是如何向ExpandoObject添加真正动态属性的极其简化版本(忽略关键字和其他处理):

        // 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);
Run Code Online (Sandbox Code Playgroud)

  • 这是因为 ExpandoObject 不公开直接的 Add 方法。如果您尝试使用 .Add,它会将该语句视为您想要向对象添加“Add”成员。您必须公开底层数据结构,基本上是访问 Dictionary 接口,才能访问其 Add 方法。删除字典中提供的成员或任何其他内容但未在 ExpandoObject 本身中公开的情况也是如此。新的文档似乎更好地解释了这一要求:https://docs.microsoft.com/en-us/dotnet/api/system.dynamic.expandoobject?view=netcore-3.1 (3认同)

sme*_*asn 21

dynamic myDynamic = new { PropertyOne = true, PropertyTwo = false};
Run Code Online (Sandbox Code Playgroud)


Kis*_*mar 11

您可以使用ExpandoObject Class它在System.Dynamic命名空间.

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

可以在ExpandoObject MSDN上找到更多信息


小智 11

 var data = new { studentId = 1, StudentName = "abc" };  
Run Code Online (Sandbox Code Playgroud)

或者值存在

  var data = new { studentId, StudentName };
Run Code Online (Sandbox Code Playgroud)

  • 这不是动态对象,而是匿名类型。 (3认同)

Dav*_*ecz 7

dynamic MyDynamic = new ExpandoObject();
Run Code Online (Sandbox Code Playgroud)