[英]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上對表達式樹有一個合理的介紹 ,但是一些集中的谷歌搜索可以使您更快地更好地理解。
您可以使用Funciton
和Action
類,但我不太確定您想做什么,但我可以給您一個提示。 函數返回一個值:
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.