Как использовать отражение, чтобы получить список значений полей объекта, которые соответствуют определенному типу? - PullRequest
0 голосов
/ 02 мая 2019

Обратите внимание, что для краткости и читабельности я заменил типы, поля и методы, с которыми проще работать.

Я определил логическое свойство, personProperty для класса, Person, в котором я хочу, чтобы метод получения, get{} вызывал частный метод, personMethod(int arg) для каждого целочисленного значения поля, которое этоопределено в Person (в данном случае _age, _phoneNumber).Следует игнорировать все другие типы, такие как readingList.

Это так, что если бы я добавил еще одно целочисленное поле к Person (или изменил или удалил любые Person имена полей), мне не пришлось бы обновлять определение personProperty, которое путемвыбор дизайна зависит от всех целочисленных полей класса Person (т. е. разработчик никогда не вводит поле int, с которым он не хочет запускать personMethod).

public Class Person
{
   private int _age;
   public int _phoneNumber;
   // protected int _futureInt;
   Dictionary<string, string> _readingList = new Dictionary<string, string>();

   public bool personProperty
   {
       get
       {
           // ...
           bool personPropertyReturnValue; 
           List<bool> resultList = new List<bool>();
           foreach(int personFieldValue in LISTOFPERSONINTS)
           {
               bool result = personMethod(personFieldValue);
               resultList.Add(result);
           }
           // Do stuff with `resultList` that'll initialize personPropertyReturnValue;
           return personPropertyReturnValue;
       }
   }

    private bool personMethod(int arg)
    {
       bool returnValue = true;
       // Do stuff to initialize `returnValue`
       return returnValue;
    }
}

Мне нужно знать, что я должен заменить LISTOFPERSONINTS, чтобы он возвращал итерируемое значение, хранящееся в _age, _phoneNumber (и во всех других будущих int, например _futureInt определено в Person).

1 Ответ

1 голос
/ 02 мая 2019

Я не думаю, что использование отражения было бы лучше, чем корректировка вашего свойства каждый раз, когда вы добавляете поле, но вы идете:

public class Person
{
    private int _age;
    public int _phoneNumber;
    // protected int _futureInt;
    Dictionary<string, string> _readingList = new Dictionary<string, string>();

    public Person(int age){
        _age = age;
    }

    public bool personProperty
    {
        get
        {
            List<bool> resultList = new List<bool>();
            var intFields = this.GetType().GetFields(BindingFlags.Instance | 
                                                     BindingFlags.NonPublic | 
                                                     BindingFlags.Public)
                                          .Where(f => f.FieldType == typeof(int))
                                          .Select(f => f.GetValue(this)).Cast<int>();
            foreach (int personFieldValue in intFields)
            {
                bool result = personMethod(personFieldValue);
                resultList.Add(result);
            }
            // Do stuff with `resultList` that'll initialize personPropertyReturnValue;
            bool personPropertyReturnValue = resultList.All(b => b);
            return personPropertyReturnValue;
        }
    }

    private bool personMethod(int arg)
    {
        return (arg > 0);
    }
}

Тест:

var person1 = new Person(0);
Console.WriteLine(person1.personProperty);   // False

var person2 = new Person(1);
Console.WriteLine(person2.personProperty);   // False

var person3 = new Person(1) { _phoneNumber = 1 };
Console.WriteLine(person3.personProperty);   // True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...