如何从多个类中获取所有相同的属性?

时间:2019-02-01 15:14:52

标签: c# reflection collections properties

情况

我想显示多个类的所有常规属性。可以说有一个具有属性“ a”和“ c”的类“ A”,还有一个具有属性“ b”和“ c”的类“ B”……所以我基本上想得到属性“ c”

有没有简单的方法可以做到这一点?

编辑

对不起,我没有告诉我编程的内容。

我基本上有一个类列表,并且我想获得这些类具有的所有属性。

我的代码只是我尝试过的证明。

真实示例:Visual Studio

如果选择2个按钮,那么你将看到所有属性,这些按钮具有一起

代码

 private void GetAllProperties(ObservableCollection<DUIElement> selecteditems)
    {
        if (selecteditems == null)
            return;

        _properties.Clear();

        foreach (DUIElement item in selecteditems)
            foreach (PropertyInfo property in item.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance))
            {
                if (property.PropertyType.Name != nameof(DPropertyViewModel))
                    continue;

                foreach (DUIElement itemnext in selecteditems)
                {
                    if (item.GroupName == itemnext.GroupName)
                        continue;

                    foreach (PropertyInfo propertynext in itemnext.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance))
                    {
                        if (propertynext.PropertyType.Name != nameof(DPropertyViewModel))
                            continue;

                        if (property.PropertyType.Name == propertynext.PropertyType.Name)
                        {
                            var prop = propertynext.GetValue(itemnext, null) as DPropertyViewModel;
                            _properties.Add(prop);
                        }
                    }
                }
            }

    }

1 个答案:

答案 0 :(得分:0)

执行此操作的一种方法是构建所有枚举项中存在的属性的列表:

List<string> Properties = null;

foreach (DUIElement item in selecteditems)
{
    // Check for first iteration
    if (Properties == null)
    {
        // Get name of properties from first iteration
        Properties = new List<string>();
        foreach (PropertyInfo item in item.GetType().GetProperties().ToList<PropertyInfo>())
            Properties.Add(item.Name);
    }
    else
    {
        // Check properties from current iteration
        foreach (PropertyInfo property in item.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance))
        {
            // Remove properties where they do not exist in current property list
            if (!Properties.Contains(property.Name))
                Properties.Remove(property.Name);
        }
    }
}

这有效地复制了第一项中的所有属性,然后删除了其余迭代中不存在的所有属性。

生成的属性名称将以Properties结尾。

我不确定您是否仅需要属性名称,或者实际上是否需要PropertyInfo。但是,您可以简单地使用Properties列表来匹配PropertyInfo中第一个对象中的selecteditems