Obter o nome de uma propriedade passando-a para um método
-
08-07-2019 - |
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.
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());