Pergunta

StackOverflow jolson usuário tinha um muito bom pedaço de código que exemplifica como se pode registar menthods sem usar cordas, mas árvores de expressão aqui .

É possível ter algo semelhante para propriedades em vez de métodos? Para passar uma propriedade (não o nome da propriedade) e no interior do método para obter o nome da propriedade?

Algo parecido com isto:


    RegisterMethod(p => p.Name)

    void RegisterMethod(Expression??? propertyExpression) where T : Property ???
    {
        string propName = propertyExpression.Name;
    }

Graças.

Foi útil?

Solução

Você pode escrever algo como isto:

static void RegisterMethod<TSelf, TProp> (Expression<Func<TSelf, TProp>> expression)
{
    var member_expression = expression.Body as MemberExpression;
    if (member_expression == null)
        return;

    var member = member_expression.Member;
    if (member.MemberType != MemberTypes.Property)
        return;

    var property = member as PropertyInfo;
    var name = property.Name;

    // ...
}

Outras dicas

Eu postei um exemplo completo desta aqui (ver também o post sobre "this" debaixo dele)

Observe que lida com o LambdaExpression etc. Como uma atualização para o código como publicado, você pode adicionar um pouco mais para torná-lo mais fácil de usar em alguns cenários:

static class MemberUtil<TType>
{
    public static string MemberName<TResult>(Expression<Func<TType, TResult>> member)
    {
        return MemberUtil.MemberName<TType, TResult>(member);
    }
}

Então você pode usar genérico tipo de inferência para o valor de retorno:

string test1 = MemberUtil<Foo>.MemberName(x => x.Bar); 
string test2 = MemberUtil<Foo>.MemberName(x => x.Bloop()); 
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top