C#以递归方式获取属性和子字段的属性

时间:2016-11-11 09:55:41

标签: c# recursion properties field expandoobject

我正在尝试将对象转换为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));

    }
}

但是对于每个Field我想再次调用convert方法:

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

由于我不知道相关字段的类型,虽然它在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; }
}

1 个答案:

答案 0 :(得分:0)

我从不同的角度看待它, 最终目标是在序列化之前转换为ExpandoObject以发送到Web客户端。这样就可以根据用户授权删除属性了。

所以我先将序列化,然后删除属性..

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