从lambda Expression获取参数

时间:2013-11-26 14:25:22

标签: c# 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}

不是写所有这些,而是​​只想写表达式并从中填充属性。

这是表达的声明:

Expression<Func<TEntity, bool?>> EnabledPropertySelector

3 个答案:

答案 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)

您可以使用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;

希望这会有所帮助......

答案 2 :(得分:-1)

如果要创建两个属性相等的IEnumerable:

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