我可以将对象属性作为一种类型来访问吗?
我正在使用一个 API,我必须遍历对象集合,并访问其中Text
两个对象的属性,以用于读取或写入。我目前有两种读写方法,如下:
Result ReadTexts()
var attribs = SOME_CODE;
string first = "", second = "";
for(int i=1 ; i <= attribs.Count ; i++) {
if(attribs[i] IS_FIRST_ONE_NEEDED) {
first = attribs[i].Text;
} else if(attribs[i] IS_SECOND_ONE_NEEDED) {
second = attribs[i].Text;
}
}
return new Result(first, second);
}
void WriteTexts(string first, string second) {
var attribs = SOME_CODE;
for(int i=1 ; i <= attribs.Count ; i++) {
if(attribs[i] IS_FIRST_ONE_NEEDED) {
attribs[i].Text = first;
} else if(attribs[i] IS_SECOND_ONE_NEEDED) {
attribs[i].Text = second;
}
}
}
我更喜欢使用更具功能性的样式,将迭代和检查集合中的两个对象合并到一个方法中,而不是重复此代码,因为实际上 SOME_CODE 以及 IS_FIRST_ONE_NEEDED 和 IS_SECOND_ONE_NEEDED 在现实中比在上面的示例代码。这种方法看起来像:
void AccessTexts(Action<StringProperty> first, Action<StringProperty> second) {
var attribs = SOME_CODE;
for(int i=1 ; i <= attribs.Count ; i++) {
if(attribs[i] IS_FIRST_ONE_NEEDED) {
first(attribs[i].Text);
} else if(attribs[i] IS_SECOND_ONE_NEEDED) {
second(attribs[i].Text);
}
}
}
然后用像这样的 lambda 表达式调用它
AccessTexts(( prop => prop = "abc"), ( prop => prop = "def"));
写作,或
AccessTexts(( prop => firstString = prop), ( prop => secondString = prop));
阅读。这会更短,并且避免重复大量代码。
但我认为这是不可能的,因为属性不会作为.net 中的真实类型公开,而只是基于特殊方法的可用性 - getter 和 setter。因此,没有类型StringProperty
,因为我在“我想写的”的代码示例中将其用作委托参数的类型。
我是对的,还是有某种方法可以按照我想要的方式实现它?