2011-02-22 16 views
3

我試圖創建一個使用C#多表達parameteres

我只能說這是這樣一個方法簽名採取各種類型的多個屬性:

AllPropertiesExcept(() => Property1,() => Property2) 

這種方法幾乎工作,但屬性的類型必須相同。我只打算使用屬性名稱,但希望使用lambda表達式來實現輕鬆重構。

public static string MyMethod<T>(params Expression<Func<T>>[] propertyExpression) 
+0

我不明白你問題中的最後一段代碼。這是你已經嘗試過並且不起作用的嗎?它只是僞代碼嗎? – Gabe 2011-02-22 18:23:50

+0

我不明白在這裏使用lambdas的目的。你不能只使用params object []來接受任何值嗎?如果你只想要名字,你只能接受字符串。 – recursive 2011-02-22 18:42:22

回答

3

我會用AllPropertiesExcept(params Expression<Func<object>>[] properties),你仍然可以得到屬性名稱出來,但它並不不管是什麼類型的屬性。

編輯:但是,我傾向於反過來使用它 - 而不是排除我不想看到的屬性,我會包括我想看到的屬性。原因很簡單 - 以你的方式工作,你仍然需要思考 - 用我的方式,你可以很容易地使用你得到的實際數據直接。

編輯2(獲取屬性的名字在表達式):

Expression<Func<object>> obj = something; // you get this in your method 

((obj.Body as UnaryExpression).Operand as MemberExpression).Member.Name 

我真的建議你使用LinqPad這樣的事情,你可以很容易地通過Dump()深入對象,很顯示的對象用戶友好。只需重新創建一個小例子和實驗即可。

2

方法AllPropertiesExcept()是否返回任何東西?否則,你可以做一個流暢接口(使用方法鏈接):

var foo = AllPropertiesExcept(() => Property1) 
    .And(() => Property2) 
    .And(() => Property3) 
    .DoSomeThing(); 

AllPropertiesExcept(() => Property1) 
    .And(() => Property2) 
    .And(() => Property3); 

即使AllPropertiesExcept()方法返回的東西,你可以直到你在方法鏈的末端調用一個方法推遲執行

0

我想你需要的是瞭解ModelMetadata類記錄在這裏: http://msdn.microsoft.com/en-us/library/system.web.mvc.modelmetadata.aspx

該類在ASP.NET MVC應用在類似的情況下Html.LabelFor(X - > x.Name) 表達式傳遞給這裏記錄的ModelMetadata.FromLambdaExpression方法: http://msdn.microsoft.com/en-us/library/ee428393.aspx

理解它是如何在MVC使用後,你可以用它如何適用於其他地方也有知情的知識創建自己的代碼。