2013-07-12 2 views
2

я прохожу через System.Linq.Expressions.Expression по способу, как this->Получить алиасы выражения Linq

Process<User>(x => new { UserId = x.Id, x.AccountNo }) 

private void Process<T>(Expression exp) 
{ 
    // Get Alias ("UserId") 
} 

Я хочу, чтобы попытаться получить псевдоним столбцов, в данном случае я хочу "UserId" для x.Id

Как это можно достичь?

ответ

1

Не зная, что вы хотите с ним делать, вот пример, чтобы получить ваши начал:

class Process 
{ 
    public int UserId { get; set; } 
    public int AccountNo { get; set; } 
} 

Process(p => new { UserId = p.UserId, p.AccountNo });  

public static void Process<T>(Expression<Func<Process, T>> expression) 
{ 
    var newExpression = (NewExpression) expression.Body; 

    var propertiesAssignement = 
     newExpression.Type.GetProperties().Zip(
      newExpression.Arguments.OfType<MemberExpression>(), 
      (p, m) => new {ProjectedName = p.Name, RealName = m.Member.Name} 
     ); 
} 

Переменная propertiesAssignment даст вам свойство Anonymous имя ProjectedName с оригинальным названием RealName. Это может быть реорганизовано в общую форму, и вы можете расширить ее.

+0

К сожалению , проект по-прежнему находится на уровне 3.5. Так что я сделал это -> для (int i = 0; i Lee337

+0

Ах. Да, 'Zip' - это .NET 4.0 +. Рассмотрим сохранение вызова 'GetProperties() во временной переменной, а затем доступ к массиву по индексу. –

+0

Круто, сделаем! благодаря! – Lee337

1

Не можете ли вы получить к нему доступ через свойство Body?

var memberExpression = expression.Body as MemberExpression; 

А потом

memberExpression.Member.Name; 
+0

Выражение само по себе не является выражением члена, это ['NewExpression'] (http://msdn.microsoft.com/en-us/library/system.linq.expressions.newexpression.aspx) –

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