簡體   English   中英

在不知道類型參數的情況下,以字符串形式獲取泛型的成員名稱

[英]Get a generic's member names as strings without knowing the type parameters

我正在使用反射來獲取一些成員名稱作為字符串。 我使用的是我在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> { }

解決此問題的好方法是什么?

最好的方法是忘記using指令,而直接使用該類:

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

天哪! 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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM