2013-11-26 4 views
1

Я не очень хорошо знаком с лямбда-выражениями. Поэтому у меня есть следующее выражение:Получить параметры из лямбда Выражение

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 может быть любого типа.

EDIT:

У меня есть много свойств. Некоторые из них зависят от других свойств. Для каждого отдельного имущества, я должен вручную написать имя и значение родительского объекта:

{ VisibilityPropertyName = 'FranchiseInfo.ExternalSystemType', VisibilityPropertyValue = ExternalSystemTypes.Master, EnabledPropertySelector = l => l.FranchiseInfo.ExternalSystemType == ExternalSystemTypes.Master} 

Вместо того, чтобы писать все это я хочу написать только выражение и заполнить свойства из него.

Это декларация expresion:

Expression<Func<TEntity, bool?>> EnabledPropertySelector 
+0

Что вы пытаетесь достичь с первым утверждением? Для доступа к свойствам FanchiseInfo вам не требуется выражение лямбда. –

+0

Вы не извлекаете данные из выражения, вы оцениваете выражение. Как спросил Ник, расскажите, что вы пытаетесь выполнить в целом, а не только с этим конкретным выражением. – Moho

+0

В какой-то момент я буду в общем контексте и вызовет EnabledPropertySelector.Compile() (e), чтобы получить значение от func. Я хочу заполнить два свойства из выражения в какой-то более ранний момент, поэтому я могу сэкономить некоторую дополнительную типизацию. – Mdb

ответ

1

Прежде всего, вам нужно Expression. Каков тип 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

, если вы хотите создать IEnumerable, где два свойства равны:

var results = EnabledPropertySelector.Where(l => l.FranchiseInfo.ExternalSystemType ==  
ExternalSystemTypes.Master.ToString()); 
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          
          }; 

Если лямбда-выражение является просто (Одна строки, с, если выражение), вы можете сделать лямбду с из {}:

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

Надеется, что это помогает ...

Смежные вопросы