2016-04-15 59 views
2

我有一种情况,我想通过方法作为参数传递属性的名称,以便该方法可以调用它。C# - 使用谓词来选择属性

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

我很困惑,整体。有谁能帮我澄清一些吗?

+1

请阅读[可能是静态代表](https://msdn.microsoft.com/en-us/library/ms173171.aspx)和[predicate](https://msdn.microsoft.com/en-us/library/bfcke1bz(v = vs。 110)的.aspx)。他们不是为此而设计的。 – DRKblade

+0

你能解释一下你期望的“谓词”吗?因为我认为你的困惑源自于你认为它会为你做点事情的事实,但事实并非如此。 – nvoigt

+1

@DRKblade - 我会阅读他们,谢谢。 – Ciel

回答

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); 
} 
+0

这是我需要完成的,是的。我只是误解了“谓词”的含义。 'Func'似乎完全适合我需要做的事情。 – Ciel

+0

非常感谢。 – Ciel

+0

事实证明,在需要的几种情况下,它工作得很好。再次感谢你。由于我在这里学到的东西,我能够重新调整一些代码,使其更好。 – Ciel

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 
    } 
} 

类,如果你喜欢这种方式