2013-11-26 101 views
1

我對lambda表達式不是很熟悉。所以,我有以下表現:從lambda獲取參數表達式

EnabledPropertySelector = l => l.FranchiseInfo.ExternalSystemType == ExternalSystemTypes.Master 

和兩個屬性:

public string VisibilityPropertyName { get; set; } 
public object VisibilityPropertyValue { get; set; } 

我想從表達提取一些數據,以便在最後,我可以得到兩個屬性的值:

VisibilityPropertyName == 'FranchiseInfo.ExternalSystemType'; 
VisibilityPropertyValue == ExternalSystemTypes.Master; 

VisibilityPropertyName始終是一個字符串。這是財產的名稱。 VisibilityPropertyValue可以是任何類型。

編輯:

我有很多屬性。其中一些依賴於其他屬性。對於每一個屬性我必須手動寫名字和父屬性的值:

{ VisibilityPropertyName = 'FranchiseInfo.ExternalSystemType', VisibilityPropertyValue = ExternalSystemTypes.Master, EnabledPropertySelector = l => l.FranchiseInfo.ExternalSystemType == ExternalSystemTypes.Master} 

而不是寫這一切我想只寫了表達,並從它填充屬性。

這是expresion聲明:

Expression<Func<TEntity, bool?>> EnabledPropertySelector 
+0

什麼是你想用第一條語句來完成?你不需要lambda表達式來訪問FanchiseInfo的屬性。 –

+0

您不會從表達式中提取數據,而是評估表達式。正如Nick所問,告訴我們你想要完成什麼,而不僅僅是這個具體表達。 – Moho

+0

在某些時候,我將在泛型上下文中調用EnabledPropertySelector.Compile()(e)從func中獲取值。我想在一些早些時候從表達式中填充這兩個屬性,這樣我就可以節省一些額外的輸入。 – Mdb

回答

1

首先關閉所有,你需要一個表達。 EnabledPropertySelector的類型是什麼?它需要像Expression<Func<T, bool>>這樣的東西,其中T是無論你的例子中的「l」的類型。

如果你已經有一個Expression那麼你可以使用表達式API提取任何你需要: -

var body = EnabledPropertySelector.Body as BinaryExpression; 

var left = body.Left as PropertyExpression; 
var outerMemberName = left.Member.Name; 
var innerMemberName = (left.Expression as PropertyExpression).Member.Name 

VisibilityPropertyName = innerMemberName + "." + outerMemberName; 

var right = body.Right as PropertyExpression; 
var rightValueDelegate = Expression.Lambda<Func<object>>(right).Compile(); 

VisibilityPropertyValue = rightValueDelegate(); 

我真的建議做一些閱讀之前正確神交表達API儘管潛水;有很多角落案件取決於你需要多麼靈活。例如。始終是表達式parameter.Property.Property == constant?它非常迅速地變得非常複雜,因此在嘗試處理任何現實世界的案例之前,您需要對基礎知識有一個深入的瞭解。

有一個合理的introduction to expression trees on MSDN,但一些專注的谷歌搜索可能會讓你更快地理解。

-1
,如果你想創建一個IEnumerable,其中兩個屬性是相同

var results = EnabledPropertySelector.Where(l => l.FranchiseInfo.ExternalSystemType ==  
ExternalSystemTypes.Master.ToString()); 
0

您可以使用FuncitonAction類,我不是很確定您想要做什麼,但我可以給小費。 函數返回值:

Function<InputType1,InputType2,ResultType> functionVariableName; 

用法:

functionVariableName = (param1, param2) => { 
           //...process both params 
           return result; 
          }; 

操作,不返回值:

Action<InputType1,InputType2> actionVariableName; 

用法:

actionVariableName= (param1, param2) => { 
           //...process both params          
          }; 

如果lambda表達式是簡單(一條線,用瞭如果表達式),你可以用出{}拉姆達:

functionVariableName = (param1, param2) => //process values and result; 

希望這有助於...