请注意,为了简洁和可读性,我替换了更易于使用的类型,字段和方法。
我为类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
)。
答案 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