2015-08-11 13 views
5

Jak przekonwertować nazwę właściwości na wyrażenie Lambda w języku C#?Nazwa właściwości do wyrażenia lambda C#

Jak to: string prop = "Name"; do (p => p.Name)

public class Person{ 
    public string Name{ get; set; } 
} 

dzięki!

+0

Wyrażenie lambda nie jest typem. Masz na myśli delegata lub drzewo wyrażenia? I * dokładnie * jakiego typu? –

+0

Nie rozumiem twojego pytania ... Chcesz przekształcić deklarację zmiennej w wyrażenie dostępu do właściwości? –

+0

Proszę wyjaśnij, co próbujesz osiągnąć. Konwertowanie nazwy właściwości na Lambda nie ma większego sensu. Dodaj kontekst. –

Odpowiedz

11

Korzystanie drzewa wyrażenie można wygenerować wyrażenia lambda.

using System.Linq.Expressions; 
public static Expression<Func<T, object>> GetPropertySelector<T>(string propertyName) 
{ 
    var arg = Expression.Parameter(typeof(T), "x"); 
    var property = Expression.Property(arg, propertyName); 
    //return the property as object 
    var conv = Expression.Convert(property, typeof(object)); 
    var exp = Expression.Lambda<Func<T, object>>(conv, new ParameterExpression[] { arg }); 
    return exp; 
} 

dla Person można nazwać to lubią:

var exp = GetPropertySelector<Person>("Name");//exp: x=>x.Name 
+1

To nie jest odbicie –

+0

Tak, masz rację. Poprawiłem odpowiedź. –

+0

Działa to tylko dla łańcucha znaków. Czy istnieje sposób, aby Expression.Lambda > generic? Wypróbowałem Expression.Lambda >, ale nie działa. –

1

Lambda to tylko anonimowa funkcja. Możesz przechowywać lambdas w delegatach, tak jak zwykłe metody. Sugeruję, abyś spróbował nadać "Name" właściwość.

public string Name { get { return p.Name; } }

Jeśli naprawdę chcesz lambda, użyj typ delegata takich jak FUNC.

public Func<string> Name =() => p.Name;

+0

Lambda nie jest metodą anonimową jako taką .. –

+0

również tak, ponieważ nie ma nazwy określającej jej lokalizację. –

+0

A co z drzewkami wyrażeń? Czy to też są delegaci? : P –

Powiązane problemy