获取属性表单对象并按继承排序

时间:2017-11-10 15:26:27

标签: c# sorting object dynamic

我需要帮助通过继承对动态对象属性进行排序。

我有一个应该创建ExpandoObject的方法。我遇到重复问题,因为“obj.GetType()。GetProperties()”获取了用于隐藏属性的“new”关键字的所有属性(请注意,baseproperty是从其他项目继承的) )。

我的解决方案是在继承级别之后对所有属性进行排序,并在最高派生类中提升属性。基类应该是最低的prio。

这可能吗?看看第二个代码片段,看看我的意思。

可选的extrainfo: 我的方法中的参数对象“obj”是我的类“UserEditModel”,请参阅下面的继承。 “UserEditModel”派生自“UserModel”, “UserModel”派生自“Otherproject.UserModel”, “Otherproject.UserModel”派生自“Otherproject.PageModelBase”

我的代码:

public static dynamic ToExpando(this object obj)
    {
        if (obj is ExpandoObject || obj is LenientExpandoObject)
            return obj;

        var result = new ExpandoObject();
        var d = result as IDictionary<string, object>; 
        var instanceProps = obj.GetType().GetProperties();

        //Add all properties except baseclass properties
        var excludeBaseClassProp = obj.GetType().GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance);
        foreach (var excludeBaseClassPropItem in excludeBaseClassProp)
        {
            d.Add(excludeBaseClassPropItem.Name, excludeBaseClassPropItem.GetValue(obj, null));
        }
        //Add the rest of the properties and prevent duplicates
        foreach (var item in instanceProps)
        {
            if (d.AsEnumerable().Any(p => p.Key.Contains(item.Name)))
                continue;

            d.Add(item.Name, item.GetValue(obj, null));
        }
        return result;
    }

我想做什么:

public static dynamic hannes(this object obj)
    {
        if (obj is ExpandoObject || obj is LenientExpandoObject)
            return obj;

        var result = new ExpandoObject();
        var d = result as IDictionary<string, object>; //work with the Expando as a Dictionary

        var props = obj.GetType().GetProperties();
        foreach (var item in props.OrderBy(prop => prop.INHERITANCE_LEVEL)) //<-----WHAT I WANT TO DO!
        {
            d.Add(item.Name, item.GetValue(obj, null));
        }
        return result;
    }

1 个答案:

答案 0 :(得分:0)

感谢您的帮助Ed Plunkett

结果如下:

struct BaseHeader
{
  A a;
  B b;
};

struct IncomingHeader : BaseHeader
{
  /* ... */
} incoming_header;

struct OutgoingHeader : BaseHeader
{
  /* ... */
} outgoing_header;

BaseHeader const&get_header() const
{
  if(/* ... */) return incoming_header;
  return outgoing_header;
}