C# - 使用谓词选择属性

时间:2016-04-15 15:33:21

标签: c# linq lambda

我有一种情况,我希望通过方法作为参数传递属性的名称,以便该方法可以调用它。

我知道我可以用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的定义。

总的来说,我很困惑。有人可以帮忙解释一下吗?

2 个答案:

答案 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可以是静态的