我需要帮助通过继承对动态对象属性进行排序。
我有一个应该创建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;
}
答案 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;
}