簡體   English   中英

從Lambda Expression獲取參數

[英]Get parameters from lambda Expression

我對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}

除了編寫所有這些內容外,我只想編寫表達式並從中填充屬性。

這是表達式的聲明:

Expression<Func<TEntity, bool?>> EnabledPropertySelector

首先,您需要一個表達式。 EnabledPropertySelector是什么類型? 它必須類似於Expression<Func<T, bool>> ,其中T是示例中“ l”的類型。

如果您已經擁有Expression則可以使用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 它真的很快變得非常復雜,因此在嘗試處理任何實際案例之前,您需要對基礎知識有深入的了解。

在MSDN上對表達式樹有一個合理的介紹 ,但是一些集中的谷歌搜索可以使您更快地更好地理解。

您可以使用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表達式很簡單(一行,沒有if表達式),則可以使out為{}的lambda:

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

希望這可以幫助...

如果要創建兩個屬性相等的IEnumerable:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM