Как получить все одинаковые свойства из нескольких классов? - PullRequest
0 голосов
/ 01 февраля 2019

СИТУАЦИЯ

Я хочу отобразить все общие свойства нескольких классов.Допустим, есть класс "A" со свойствами "a" и "c", и есть класс "B" со свойствами "b" и "c" ... поэтому я в основном хочу получить свойство "c"

Есть ли какой-нибудь простой способ сделать это?

РЕДАКТИРОВАТЬ

Извините, плохо, что я не сказал, что я запрограммировал.

У меня в основном есть список классов, и я хочу получить все свойства, которые есть у этих классов вместе.

Мой код является просто доказательством того, что я что-то пробовал.

реальный пример: VisualStudio

Если вы выберете 2 кнопки, вы увидите все свойства, которые эти кнопки имеют вместе

CODE

 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 голосов
/ 01 февраля 2019

Один из способов сделать это - создать список свойств, которые существуют во всех перечисленных элементах:

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.

...