У пользователя 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;
// ...
}
@Vasi - тип лямбды должен быть явным. Например, нельзя просто использовать Expression. TProp здесь относится к "int" и т. д., Описывающим свойство. Однако вы можете позволить компилятору разобраться в этом.
TProp выражает возвращаемый тип свойства и необходим для описания метода, который принимает что-то и возвращает что-то еще, например: Func <TSelf, TProp>. Затем на основе этого типа делегата строится дерево выражений.
Я опубликовал полный пример этого здесь (см. Также сообщение о "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());
Привет, Марк, Большое спасибо, это именно то, что я искал, чтобы как-то игнорировать тип свойства.
@Vasi - дженерики - это "все или ничего", когда дело доходит до вывода типа (возможно, в какой-то момент у нас будет "бормотать" типизацию). Приведенный выше трюк позволяет компилятору определять тип свойства без необходимости указывать его самостоятельно ;-p
Зачем нужен TProp? Я протестировал, и это работает, но я понимаю, что мне нужно изучить деревья выражений.