Я использую отражение, чтобы получить имена некоторых членов в виде строк. Я использую метод, который нашел в Google Code (но я не очень хорошо понимаю магию отражения / LINQ, которую он использует):
public static class MembersOf<T> {
public static string GetName<R>(Expression<Func<T,R>> expr) {
var node = expr.Body as MemberExpression;
if (object.ReferenceEquals(null, node))
throw new InvalidOperationException("Expression must be of member access");
return node.Member.Name;
}
}
Это прекрасно работает в статических конструкторах. Я просто использую это так:
using ClassMembers = MembersOf<MyClass>;
class MyClass
{
public int MyProperty { get; set; }
static MyClass
{
string lMyPropertyName = ClassMembers.GetName(x => x.MyProperty);
}
}
При таком подходе вы избегаете неправильного ввода имен членов в строковых литералах и можете использовать инструменты автоматического рефакторинга. Приятно иметь при реализации INotifyPropertyChanged
!
Но теперь у меня есть универсальный класс, который я хочу использовать таким же образом, и Я узнал , что нельзя использовать несвязанные типы в качестве параметров универсального типа:
using ClassMembers = MembersOf<MyGeneric<>>;
class MyGeneric<T> { }
Что может быть хорошим способом обойти эту проблему?