Получите имя свойства, передав его методу
-
08-07-2019 - |
Вопрос
У пользователя StackOverflow jolson был очень хороший фрагмент кода, который иллюстрирует, как можно регистрировать методы, не используя строки, а деревья выражений. здесь.
Можно ли иметь что-то подобное для свойств вместо методов?Передать свойство (а не имя свойства) и внутри метода получить имя свойства?
Что-то вроде этого:
RegisterMethod(p => p.Name)
void RegisterMethod(Expression??? propertyExpression) where T : Property ???
{
string propName = propertyExpression.Name;
}
Спасибо.
Решение
Вы можете написать что-нибудь по этому поводу:
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;
// ...
}
Другие советы
Я опубликовал полный пример этого здесь (см. также пост о «this
"под ним)
Обратите внимание, что речь идет о LambdaExpression
и т. д.В качестве обновления опубликованного кода вы можете добавить еще немного, чтобы его было проще использовать в некоторых сценариях:
static class MemberUtil<TType>
{
public static string MemberName<TResult>(Expression<Func<TType, TResult>> member)
{
return MemberUtil.MemberName<TType, TResult>(member);
}
}
Затем вы можете использовать общий вывод типа для возвращаемого значения:
string test1 = MemberUtil<Foo>.MemberName(x => x.Bar);
string test2 = MemberUtil<Foo>.MemberName(x => x.Bloop());