我对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
答案 0 :(得分:1)
首先,你需要一个表达式。 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
形式的表达式总是?它变得非常复杂,因此在尝试处理任何真实案例之前,您需要对基础知识有充分的了解。
有一个合理的introduction to expression trees on MSDN,但一些专注的谷歌搜索可能会让你更快地理解。
答案 1 :(得分:0)
您可以使用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;
希望这会有所帮助......
答案 2 :(得分:-1)
如果要创建两个属性相等的IEnumerable:
var results = EnabledPropertySelector.Where(l => l.FranchiseInfo.ExternalSystemType ==
ExternalSystemTypes.Master.ToString());