根据继承对 属性 列表进行排序
sort property list according to inheritance
我有某些 class 是从其他 class 继承而来的。每个 class,仅继承自另一个 class,而不是两个 class。
我还有一个 Base-Class,它是我的继承树的 "top"。
Class例如:
public class IfcAlignment : IfcLinearPositioningElement
{
public IfcAlignmentTypeEnum PredefinedType {get; set;}
}
public class IfcLinearPositioningElement : IfcProduct
{
public IfcCurve Axis {get; set;}
}
public class IfcProduct : IfcObject
{
public IfcObjectPlacement ObjectPlacement {get; set;}
public IfcProductRepresentation Representation {get; set;}
}
public class IfcObject: IfcRoot
{
IfcLabel ObjectType {get; set;}
}
public class IfcRoot : IfcBase
{
public IfcGloballyUniqueId GlobalId {get; set;}
public IfcOwnerHistory OwnerHistory {get; set;}
public IfcLabel Name {get; set;}
public IfcText Description {get; set;}
}
public abstract class IfcBase
{
public int _ID {get; set;}
}
这是我的结构中的一组继承。当我现在调用 IfcAlignment 的属性并循环遍历它们时,我按以下顺序获取它们:
- 预定义类型
- 轴
- 对象放置
- 代表
- 对象类型
- GlobalId
- 所有者历史
- 姓名
- 描述
- _ID
但是我需要这些属性的顺序是 "top-to-bottom" 所以:
- _ID
- GlobalId
- 所有者历史
- 姓名
- 描述
- 对象类型
- 对象放置
- 代表
- 轴
- 预定义类型
因此我想在每个 class 中实现一个方法,您可以调用该方法并将属性按正确顺序排序。到目前为止,该方法看起来像这样:
override public List<PropertyInfo> SortMyProperties(object entity)
{
List<PropertyInfo> returnValue = new List<PropertyInfo>();
if (entity is IfcBase && !entity.GetType().Name.Contains("IfcBase"))
{
//Here I need to get the actual parent object:
// I tried the following, which did no work unfortunately:
// var parent = entity.GetType().BaseType;
PropertyInfo propInfo = parent.SortMyProperties(parent);
//get my own properties:
Type type = entity.GetType();
var genuineProps = typeof(/*type of the current class*/).GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);
foreach (var prop in genuineProps)
{
returnValue.Add(prop);
}
return returnValue;
}
else
{
var properties = this.GetType().GetProperties();
foreach (var prop in properties)
{
returnValue.Add(prop);
}
return returnValue;
}
}
有谁知道如何访问父对象而不仅仅是父类型,而我在当前代码中正在这样做?还有其他解决问题的建议吗?
你能试试这个吗?这将是实现您要求的更好解决方案
var type = typeof(IfcAlignment);
List<string> PropertyNames= new List<string>();
while(type!=null)
{
var properties = type.GetProperties().Where(x => x.DeclaringType == type).Select(x=>x.Name).Reverse().ToList();
foreach(string name in properties)
{
PropertyNames.Add(name);
}
type = type.BaseType;
}
PropertyNames.Reverse();
我有某些 class 是从其他 class 继承而来的。每个 class,仅继承自另一个 class,而不是两个 class。 我还有一个 Base-Class,它是我的继承树的 "top"。 Class例如:
public class IfcAlignment : IfcLinearPositioningElement
{
public IfcAlignmentTypeEnum PredefinedType {get; set;}
}
public class IfcLinearPositioningElement : IfcProduct
{
public IfcCurve Axis {get; set;}
}
public class IfcProduct : IfcObject
{
public IfcObjectPlacement ObjectPlacement {get; set;}
public IfcProductRepresentation Representation {get; set;}
}
public class IfcObject: IfcRoot
{
IfcLabel ObjectType {get; set;}
}
public class IfcRoot : IfcBase
{
public IfcGloballyUniqueId GlobalId {get; set;}
public IfcOwnerHistory OwnerHistory {get; set;}
public IfcLabel Name {get; set;}
public IfcText Description {get; set;}
}
public abstract class IfcBase
{
public int _ID {get; set;}
}
这是我的结构中的一组继承。当我现在调用 IfcAlignment 的属性并循环遍历它们时,我按以下顺序获取它们:
- 预定义类型
- 轴
- 对象放置
- 代表
- 对象类型
- GlobalId
- 所有者历史
- 姓名
- 描述
- _ID
但是我需要这些属性的顺序是 "top-to-bottom" 所以:
- _ID
- GlobalId
- 所有者历史
- 姓名
- 描述
- 对象类型
- 对象放置
- 代表
- 轴
- 预定义类型
因此我想在每个 class 中实现一个方法,您可以调用该方法并将属性按正确顺序排序。到目前为止,该方法看起来像这样:
override public List<PropertyInfo> SortMyProperties(object entity)
{
List<PropertyInfo> returnValue = new List<PropertyInfo>();
if (entity is IfcBase && !entity.GetType().Name.Contains("IfcBase"))
{
//Here I need to get the actual parent object:
// I tried the following, which did no work unfortunately:
// var parent = entity.GetType().BaseType;
PropertyInfo propInfo = parent.SortMyProperties(parent);
//get my own properties:
Type type = entity.GetType();
var genuineProps = typeof(/*type of the current class*/).GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);
foreach (var prop in genuineProps)
{
returnValue.Add(prop);
}
return returnValue;
}
else
{
var properties = this.GetType().GetProperties();
foreach (var prop in properties)
{
returnValue.Add(prop);
}
return returnValue;
}
}
有谁知道如何访问父对象而不仅仅是父类型,而我在当前代码中正在这样做?还有其他解决问题的建议吗?
你能试试这个吗?这将是实现您要求的更好解决方案
var type = typeof(IfcAlignment);
List<string> PropertyNames= new List<string>();
while(type!=null)
{
var properties = type.GetProperties().Where(x => x.DeclaringType == type).Select(x=>x.Name).Reverse().ToList();
foreach(string name in properties)
{
PropertyNames.Add(name);
}
type = type.BaseType;
}
PropertyNames.Reverse();