获取动态类型的属性

13

我想知道如何获取我的动态类型的属性。

这是获取列表的函数,

var result = _files.GetFileContent(reportId).Result;

举个例子,我得到了一个像这样的对象:

enter image description here

当我打开它时,你可以看到我拥有的属性:

enter image description here

我的想法是,我永远不知道这些属性。它们可能会随着时间而改变。因此,我想要一个填充有所有属性的列表,这样我就可以动态使用它们。

如何从第一个项目(ChargesDelta_DIFF_5、ChargesEfile_RIGHT、ChargesGecep_LEFT等)中获取属性?


MyDynamicType 是如何声明的?集合是如何声明的? - Lasse V. Karlsen
你尝试过使用 https://msdn.microsoft.com/en-us/library/aky14axb(v=vs.110).aspx 吗? - Yaugen Vlasau
它根据我从存储过程接收到的属性动态声明。 - Walter
2个回答

17
您可以使用反射获取属性并将其转换为字典:
dynamic v = new { A = "a" };

Dictionary<string, object> values = ((object)v)
                                     .GetType()
                                     .GetProperties()
                                     .ToDictionary(p => p.Name, p => p.GetValue(v));

1
我该如何在这种情况下使用现有的动态IList<Object>? - Walter
1
什么是p?仅仅介绍未知变量是没有帮助的。该行代码会抛出:CS1977 无法将lambda表达式作为动态调度操作的参数使用,除非先将其转换为委托或表达式树类型。 - Harmen
我不确定你的意思。那不仅仅是一个未知变量,它是lambda表达式的参数。代码应该没问题。你能创建一个新的问题并在这里链接吗?请放入你的完整代码。@harmen - Patrick Hofman
1
@Harmen,缺少了一个强制类型转换。不确定为什么之前可以工作。也许我在发布时过于泛化了。修复方法是将v替换为((object)v) - Patrick Hofman
2
这怎么能被标记为正确答案呢?它根本没有返回动态属性(在ExpandoObject上已确认)。 - War
显示剩余3条评论

11
如果有人仍在苦苦挣扎(就像我一样),这可能会有用。
假设“data”是您想要列出所有属性的动态对象:
这对我很有效。
using System.ComponentModel;

...

dynamic data = new {
    value1 = 12,
    value2 = "asdasd",
    value3 = 98,
    value4 = "pgiwfj",
};

foreach (PropertyDescriptor prop in TypeDescriptor.GetProperties(data))
{
    Console.WriteLine("PROP: " + prop.Name);
}

...

然后它将输出:
  • PROP: value1
  • PROP: value2
  • PROP: value3
  • PROP: value4
来源:https://social.msdn.microsoft.com/Forums/vstudio/en-US/251e4f3d-ce90-444a-af20-36bc11864eca/how-to-get-list-of-properties-of-dynamic-object-?forum=csharpgeneral

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接