c#可以递归地获取属性和子字段的属性

本文关键字:属性 字段 获取 递归 | 更新日期: 2023-09-27 18:17:38

我正在尝试将对象转换为ExpandoObject。

目前我已经有了属性和字段的数组,

Type type = data.GetType();
FieldInfo[] fields = type.GetFields();
PropertyInfo[] props = type.GetProperties();

我可以很容易地遍历道具并获得每个道具的值,并将其添加到我的ExpandoObject:

public static ExpandoObject ConvertToExpandoObject(object data)
{
    var dynObj = new ExpandoObject(); 
    Type type = data.GetType();
    FieldInfo[] fields = type.GetFields();
    PropertyInfo[] props = type.GetProperties();
    // first the properties...
    foreach (var property in props)
    {
        // add this property
        ((IDictionary<string, object>)dynObj).Add(property.Name, property.GetValue(data,null));
    }
}

但是对于每个字段,我想再次调用convert方法,这样:

foreach (var field in fields)
{
    // add this field
    ((IDictionary<string, object>)dynObj).Add(field.Name,ConvertToExpandoObject(field?? as an object));               
}

因为我不知道所讨论的Field的类型,尽管它是在Field中。FieldType,我如何将字段转换为自己类型的对象以传递给转换函数?

编辑:

全文作为一个块,希望能更清楚:

public static ExpandoObject ConvertToExpandoObject(object data)
{
    var dynObj = new ExpandoObject(); 
    Type type = data.GetType();
    FieldInfo[] fields = type.GetFields();
    PropertyInfo[] props = type.GetProperties();
    // first the properties...
    foreach (var property in props)
    {
        // add this property
        ((IDictionary<string, object>)dynObj).Add(property.Name, property.GetValue(data,null));
    }
    foreach (var field in fields)
    {
         // add this field
         ((IDictionary<string, object>)dynObj).Add(field.Name,ConvertToExpandoObject(field?? as an object));               
    }
}
编辑2:

示例对象-它们是微不足道的。现在它可能是学术性的,因为我可以很容易地预见到什么时候它们不会是……可能会回到绘图板

class Parent
{
    public string parentVar { get; set; }
    public Child child { get; set; }
}
class Child
{
    public string childvar { get; set; }
}

c#可以递归地获取属性和子字段的属性

我从另一个角度看它,最终的对象是在序列化它发送到web客户端之前转换为ExpandoObject。这样就可以根据用户的授权删除属性。

所以我只是先序列化它,然后删除属性…

ExpandoObject dynObj = JsonConvert.DeserializeObject<ExpandoObject>(JsonConvert.SerializeObject(data));