在不知道类型参数的情况下,将泛型的成员名称作为字符串

时间:2011-09-09 19:52:52

标签: c# generics reflection

我使用反射将一些成员名称作为字符串。我使用的方法on 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时很高兴!

但是现在我有一个我想以相同方式使用的泛型类,I've learned你不能使用未绑定类型作为泛型类型参数:

using ClassMembers = MembersOf<MyGeneric<>>;

class MyGeneric<T> { }

解决这个问题的好方法是什么?

2 个答案:

答案 0 :(得分:1)

最好的方法是忘记using指令并直接使用该类:

string propName = MembersOf<MyGeneric<T>>.GetName(x => x.SomeProp);

答案 1 :(得分:0)

D'哦! 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);
    }
}