2013-11-26 65 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; 

希望这有助于...