如何使用反射来获取与特定类型匹配的对象字段的值列表?

时间:2019-05-02 17:35:40

标签: c# reflection

请注意,为了简洁和可读性,我替换了更易于使用的类型,字段和方法。

我为类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 个答案:

答案 0 :(得分:1)

我不认为使用反射会比每次添加字段来调整属性都要好,但是您可以:

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