ChatGPT解决这个技术问题 Extra ChatGPT

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

例如,ControllerBase 类的 ViewBag 属性,我们可以动态获取/设置值并向该对象添加任意数量的附加字段或属性,这很酷。我想在其他类型的应用程序中使用类似的东西,而不是 MVC 应用程序和 Controller 类。当我尝试创建 dynamic 对象并像这样设置它的属性时:

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

我有 RuntimeBinderException 与消息 Property or indexer '<>f__AnonymousType0.A' cannot be assigned to -- 它是只读的在第 2 行。另外,我怀疑它不是什么我在找。也许有一些课程可以让我做类似的事情:

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

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


M
Mario S
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());

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


请投票支持 Visual Studio UserVoice 中的此功能。
P
Pang

我最近需要更进一步,即根据用户定义的条目在动态对象中添加属性,使其自身动态化。此处和 Microsoft's ExpandoObject documentation 中的示例并未专门针对动态添加属性,但可以从您枚举和删除属性的方式推测。无论如何,我认为这可能对某人有帮助。这是一个非常简化的版本,说明如何将真正的动态属性添加到 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);

任何人都知道为什么我们必须键入 cast 才能访问 Add 方法?这对我来说似乎很奇怪。
这是因为 ExpandoObject 没有公开直接的 Add 方法。如果您尝试使用 .Add,它会将该语句视为您想要将“添加”成员添加到对象。您必须公开底层数据结构,基本上是进入 Dictionary 接口,才能访问其 Add 方法。这也适用于删除一个成员或字典中提供但未在 ExpandoObject 本身中公开的任何其他内容。较新的文档似乎更好地解释了这一要求:docs.microsoft.com/en-us/dotnet/api/…
n
nothrow

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;

A
Andrew
dynamic myDynamic = new { PropertyOne = true, PropertyTwo = false};

P
Pang
var data = new { studentId = 1, StudentName = "abc" };  

或存在价值

var data = new { studentId, StudentName };

谢谢,正是我想要的
K
Kishore Kumar

您可以使用 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++; });

如需更多信息,请访问 ExpandoObject MSDN


D
Davecz
dynamic MyDynamic = new ExpandoObject();