Получить имена членов универсального в виде строк, не зная параметров типа - PullRequest
0 голосов
/ 09 сентября 2011

Я использую отражение, чтобы получить имена некоторых членов в виде строк. Я использую метод, который нашел в 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> { }

Что может быть хорошим способом обойти эту проблему?

Ответы [ 2 ]

1 голос
/ 09 сентября 2011

Лучше всего было бы забыть директиву using и просто использовать класс напрямую:

string propName = MembersOf<MyGeneric<T>>.GetName(x => x.SomeProp);
0 голосов
/ 09 сентября 2011

D'Oh!Псевдоним using ClassMembers скрывал очевидное.Мне просто нужно использовать MembersOf<MyGeneric<T>> прямо в моем классе!

class MyGeneric<T>
{
    public int MyProperty { get; set; }

    static MyClass<T>
    {
        string lMyPropertyName = MembersOf<MyGeneric<T>>.GetName(x => x.MyProperty);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...