gpt4 book ai didi

c# - 如何动态新建匿名类?

转载 作者:IT王子 更新时间:2023-10-29 03:37:10 25 4
gpt4 key购买 nike

在 C# 3.0 中,您可以使用以下语法创建匿名类

var o1 = new { Id = 1, Name = "Foo" };

有没有办法动态创建这些匿名类到一个变量?


例子:

var o1 = new { Id = 1, Name = "Foo" };
var o2 = new { SQ = 2, Birth = DateTime.Now };

动态创建示例:

var o1 = DynamicNewAnonymous(new NameValuePair("Id", 1), new NameValuePair("Name", "Foo"));
var o2 = DynamicNewAnonymous(new NameValuePair("SQ", 2), new NameValuePair("Birth",
DateTime.Now));

因为我需要做:

dynamic o1 = new ExpandObject(); 
o1."ID" = 1; <--"ID" is dynamic name
o1."Name" = "Foo"; <--"Name" is dynamic name

和场景 1:

void ShowPropertiesValue(object o)
{
Type oType = o.GetType();
foreach(var pi in oType.GetProperties())
{
Console.WriteLine("{0}={1}", pi.Name, pi.GetValue(o, null));
}
}

如果我调用:

dynamic o1 = new ExpandObject();
o1.Name = "123";
ShowPropertiesValue(o1);

无法显示结果:

Name = 123

还有我如何将 ExpandoObject 转换为 AnonymouseType ?

Type type = o1.GetType();
type.GetProperties(); <--I hope it can get all property of o1

最后,我修改 ShowPropertiesValue() 方法

void ShowPropertiesValue(object o)
{
if( o is static object ) <--How to check it is dynamic or static object?
{
Type oType = o.GetType();
foreach(var pi in oType.GetProperties())
{
Console.WriteLine("{0}={1}", pi.Name, pi.GetValue(o, null));
}
}
else if( o is dynamic object ) <--How to check it is dynamic or static object?
{
foreach(var pi in ??? ) <--How to get common dynamic object's properties info ?
{
Console.WriteLine("{0}={1}", pi.Name, pi.GetValue(o, null));
}
}
}

如何实现 DynamicNewAnonymous 方法或如何修改 ShowPropertiesValue()?

我的动机是:

dynamic o1 = new MyDynamic();
o1.Name = "abc";
Type o1Type = o1.GetType();
var props = o1Type.GetProperties(); <--I hope can get the Name Property

如果我可以 Hook dynamicObject 的 GetType 方法,并强制转换为强类型类型。上面的 Seamless 代码可以正常工作。

最佳答案

匿名类型只是隐式声明的常规类型。他们与 dynamic 关系不大.

现在,如果您要使用 ExpandoObject并通过 dynamic 引用它变量,您可以动态添加或删除字段。

编辑

当然可以:只需将其转换为 IDictionary<string, object> .然后就可以使用索引器了。

您使用相同的转换技术来遍历字段:

dynamic employee = new ExpandoObject();
employee.Name = "John Smith";
employee.Age = 33;

foreach (var property in (IDictionary<string, object>)employee)
{
Console.WriteLine(property.Key + ": " + property.Value);
}
// This code example produces the following output:
// Name: John Smith
// Age: 33

可以通过单击该链接找到上述代码和更多内容。

关于c# - 如何动态新建匿名类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3740021/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com