C# c如何通过反射获得派生类属性列表,首先按基类属性排序,然后按派生类属性排序

C# c如何通过反射获得派生类属性列表,首先按基类属性排序,然后按派生类属性排序,c#,inheritance,reflection,properties,derived-class,C#,Inheritance,Reflection,Properties,Derived Class,我希望从派生类中获取属性列表 我写了一个函数,它给出了我的属性列表。 我的问题是,我希望属性列表包含基类的第一个属性和派生类的第二个属性 我该怎么做?现在我首先得到了派生的属性,然后是基的属性 PropertyInfo[] props = typeof(T).GetProperties(); Dictionary<string, ColumnInfo> _colsDict = new Dictionary<string, ColumnInfo>();

我希望从派生类中获取属性列表 我写了一个函数,它给出了我的属性列表。 我的问题是,我希望属性列表包含基类的第一个属性和派生类的第二个属性 我该怎么做?现在我首先得到了派生的属性,然后是基的属性

PropertyInfo[] props = typeof(T).GetProperties();
        Dictionary<string, ColumnInfo> _colsDict = new Dictionary<string, ColumnInfo>();

        foreach (PropertyInfo prop in props)
        {
            object[] attrs = prop.GetCustomAttributes(true);
            foreach (object attr in attrs)
            {
                ColumnInfo colInfoAttr = attr as ColumnInfo;
                if (colInfoAttr != null)
                {
                    string propName = prop.Name;
                    _colsDict.Add(propName, colInfoAttr);                        
                }
            }
        }

如果您知道基类类型,可能可以执行以下操作:

  public static Dictionary<string, object> GetProperties<Derived, Base>()
  {
        var onlyInterestedInTypes = new[] { typeof(Derived).Name, typeof(Base).Name };

        return Assembly
            .GetAssembly(typeof(Derived))
            .GetTypes()
            .Where(x => onlyInterestedInTypes.Contains(x.Name))
            .OrderBy(x => x.IsSubclassOf(typeof(Base)))
            .SelectMany(x => x.GetProperties())
            .GroupBy(x => x.Name)
            .Select(x => x.First())
            .ToDictionary(x => x.Name, x => (object)x.Name);
  }

对您来说最重要的部分是.OrderByx=>x.IsSubclassOftypeofBase,它将对属性进行排序。

Hmmm。。。我认为您需要首先提取基类,获取它的属性并添加剩余的属性。意识到;属性可以是新的,并且基类可以有一个基类。在提取基类的字段之后,如何提取派生类的剩余字段?有反向方法,但会还原我的所有属性,我不想让基类先按顺序出现,然后派生字段按顺序出现。我可能没有抓住要点。如果存在BaseType,您不能使用Type.BaseType获取基类并从中获取属性吗?我使用了上面的回答,但我得到了一个包含大量数据的字典,其中不仅包括properties@Shoejep,您能提供帮助吗?我的代码是:List props=Assembly.GetAssemblytypeofT.GetTypes.OrderByx=>x.IsSubclassOftypeofBaseAuctionDataSum.SelectManyx=>x.GetProperties.GroupByx=>x.Name.Selectx=>x.First.ToList;为什么我得到的记录比我预期的要多?我已经创建了一个.Net小提琴,告诉你应该如何使用我的答案:,因为我不知道你的评论中的t或BaseAuctionDataSum是什么类型。我再次尝试了这个方法,但遇到了同样的问题,正如你在我的小提琴附件中看到的,如果程序集中还有更多的类,我也会得到它们的属性,但是我只想要我的基类和派生类oop的属性,我的坏,我添加了另一个fiddle,它只挑选基类型和派生类型: