2014-09-23 28 views
2

是否可以創建一個具有2個輸出值的函數?帶有2個輸出值的Func <>

我需要一種方法從對象中獲取2個屬性,最好通過表達式,因爲 易於使用。 使用它與查詢提供程序一起選擇多個字段。

protected Expression<Func<T, TProperty1, TProperty2>> Select2Properties { get; set; } 

public MyClass(Expression<Func<T, TProperty1, TProperty2>> selector) { 
    Select2Properties = selector; 
} 

// desired usage (pseudo) 
x => (x.Property1, x.Property); 

我知道這是完整的垃圾,但是任何其它溶液(例如要求2個的表達屬性選擇或需要的元組)導致有時不可讀構造函數調用,特別是當我需要多於2個屬性:

x => x.Property1, x => x.Property2, x => x.Property3, x => x.Property4 
// or 
x => Tuple.Create(x.Property1, x.Property2, x.Property3, x.Property4) 

有沒有辦法實現我想要的?

回答

5

選擇了從選擇兩個屬性,你可以使用匿名類型,如果你不喜歡一個Tuple的語法:

x => new { x.Property1, x.Property }; 

如果不是在上下文中是可行的(一般是因爲類型需要在定義的範圍之外使用),那麼當您希望選擇多個值時,您應該簡單地創建命名類型以從您的選擇器中選擇。

4

Func<...>只有常規參數。你可以,但是,創建自己的委託類型:

delegate bool Foo(string s, out int i, out char c); 

顯然混合任何你想要的...不過:您不能混合使用Expression,至少不是通過C#編譯器的表達式樹生成器:

表達式樹可以不包含一個賦值操作符

表達式樹lambda不能包含out或ref參數

lambda表達式用語句正文不能轉換爲表達式樹

另一個選項是獲取具有可變屬性的參數。例如:

delegate bool Foo(SomeArgs args); 
class SomeArgs { 
    public string Name {get;set;} 
    public int Count {get;set;} 
    public char Whatever {get;set;} 
} 

立即實現可以簡單地改變參數的屬性。

+0

使用表達式表示該代碼可能被查詢提供程序使用,使得這幾乎肯定不是一個可行的選項。 – Servy 2014-09-23 14:40:44

+0

@Servy是的,它不適合查詢提供商;根據我剛剛編輯的內容,它不能很好地與'Expression'搭配使用。 – 2014-09-23 14:42:33

+0

@Servy是的,表達式將被推入一個規範,然後通過應用到一個IQueryable來查找一個條目,其中2個等於2的屬性傳遞參數。所以是的,我需要一個表達。 – xvdiff 2014-09-23 14:55:33

相關問題