2013-11-15 89 views
0
public class Tomato 
{} 
public class Potato 
{} 
public class UIPotatoBinding(Expression<Func<object>> expression) 
{ 
    // What to put here to make sure lambda results in Potato(s) 
}  
public class UITomatoBinding(Expression<Func<object>> expression) 
{ 
    // What code do I need to put here to determine if the lambda expression being passed in 
    // results in Tomato, List<Tomato>, IEnumerable<Tomato>, ObservableCollection<Tomato> 
    // TomatoCollection, or some other Tomato related Linq construct. 
} 

這個lambda表達式對我來說仍然是外來的。我很抱歉,如果我問一些已經在別處已經回答過的明顯問題。如何評估拉姆達表達式以確定對象類型

+0

如果沒有公共的超類/接口,所以你可以讓編譯器在編譯時檢查它......運行它,轉換並檢查異常。 – SJuan76

+1

更好的是,使用'TypeOf'或'as'並檢查過濾器是否存在任何東西。 – SJuan76

+0

你可以編輯你的問題,包括什麼問題被解決一個級別高於這個,請嗎?知道這可能有助於獲得更好的答案,或指向不同的方向。 – chwarr

回答

2

下面是一個例子來做你想做的。如果你有它,將會在linqpad中運行。

void Main() 
{ 
    Expression<Func<object>> f =() => new Potato(); 
    Helper.MyProduce(f); 
} 


public class Tomato 
{} 
public class Potato 
{} 

public static class Helper 
{ 
    public static void MyProduce(Expression<Func<object>> expression) 
    { 
     var func = expression.Compile(); 
     var result = func(); 

     if(result is Tomato) 
      Console.Write("Tomato"); 
     else if (result is Potato) 
      Console.Write("Potato"); 
     else 
      Console.Write("Unknown"); 
    } 
} 
+0

感謝您的回覆。今天晚上將嘗試實施這個變化。 – Wonderbird

3

在回答您的評論

I need to be able to handle List<Tomato>, IEnumerable<Tomato>, ObservableCollection<Tomato>, Tomato, TomatoCollection

前三他們(也可能是最後一個)可以在IEnumerable<Tomato>恢復。

如果混合一個在這些中返回Tomato的lambda,我看不出什麼感覺,可能你會更適合重載方法。

所以:

public class MyProduce(Func<IEnumerable<Tomato>> expression) // No need to make it an expression, so you allow for an already compiled lambda to be used. 

,如果你想添加的Tomato

public class MyProduce(Func<Tomato> expression) { 
     Func<IEnumerable<Tomato>> expression2 =() => (new Tomato[] { expression() }); 
     // Here you use expression2 as in the previous constructor. 
} 

如果你想添加Potato進來,要麼使課堂通用或建立共同的超類/接口兩個班。

底線是:使您的先決條件更強

如果你允許你的代碼接收任何東西,你將無法對你正在處理的內容做出有效的假設,並且你的代碼將會以很多spaggetti結束。允許通過object,並希望你的代碼處理它,它禁止你使用語言提供給你的設施(你可能用Javascript編寫,值得)。

+0

'ArrayList'不是通用的;你可能只想在那裏使用一個數組。 – Servy

+0

@Servy修復它謝謝。來自Java並仍然在學習BCL(我的回答感興趣正在得到糾正): - D. – SJuan76

+0

是的,Java用戶總是犯這個錯誤 – Servy