我有一种情况,我希望通过方法作为参数传递属性的名称,以便该方法可以调用它。
我知道我可以用Reflection
做到这一点,但这有点矫枉过正 - 而且很复杂,因为我想要的。所以我进行了更多探索,发现了Predicate<T>
的奇迹。
这基本上就是我要做的事情,请记住,这就像 - 最基本的,快速抛出的例子可能;
public class ContainingParentClassWithProperties {
public PackagedClassWithProperty OptionOne {
get; set;
} = new PackagedClassWithProperty {
DesiredTargetProperty = "1"
};
public PackagedClassWithProperty OptionTwo {
get; set;
} = new PackagedClassWithProperty {
DesiredTargetProperty = "2"
};
}
一种包含属性的对象的基本包装。
然后是一种可以接受它们的方法。
public void TryAcceptPredicateMethod(Predicate<ContainingParentClassWithProperties> p) {
Console.WriteLine(p.DesiredTargetProperty);
}
然后使用它;
public void TryCallAcceptPredicateMethod() {
TryAcceptPredicateMethod(n => n.OptionOne);
}
我遇到两个主要问题;
1.“无法转换lambda”当我尝试调用该方法时出现以下错误;
无法将lambda表达式转换为预期的委托类型,因为块中的某些返回类型不能隐式转换为委托返回类型
老实说,我不知道这是什么意思。我不是很熟悉lambda表达式;
2.调用预期的权利试图写出/调用我瞄准的属性是不行的;它告诉我Predicate<ContainingParentClassWithProperties>
不包含DesiredTargetProperty
的定义。
答案 0 :(得分:1)
你不应该使用Predicate
。在我的评论中,请了解有关谓词的更多信息。
但在这里我认为你可以这样做
public void TryAcceptPredicateMethod(Func<PackagedClassWithProperty> p) {
Console.WriteLine(p.DesiredTargetProperty);
}
public void TryCallAcceptPredicateMethod() {
// n should be a variable or something in the type of ContainingParentClassWithProperties
TryAcceptPredicateMethod(() => n.OptionOne);
}
答案 1 :(得分:0)
如何将属性定义为
public class PropertyContainingClass
{
public int MyProperty
{
get
{
if(isRunningLocal)
{
return 1;
}
else
{
return 2;
}
}
}
private bool isRunningLocal{ get; set; }
public PropertyContainingClass()
{
this.isRunningLocal = //code to determine whether running local
}
}
如果您喜欢,那么Class可以是静态的