2016-04-15 78 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 
    } 
} 

類,如果你喜歡這種方式