2010-10-10 118 views
1

我有這樣的獲取公共領域?

private struct Combinators 
{ 
    public const char DirectChild = '>'; 
    public const char NextAdjacent = '+'; 
    public const char NextSiblings = '~'; 
    public const char Descendant = ' '; 
} 

我想使用反射來獲取在結構中的public const char領域的所有值的列表(儘可能具體)定義的結構。我怎樣才能做到這一點?

回答

8
var fieldValues = typeof(Combinators) 
    .GetFields() 
    .Where(x => x.FieldType == typeof(char) && x.IsLiteral) 
    .ToDictionary(x => x.Name, x => (char)x.GetValue(null)); 

返回Dictionary<string, char>其中鍵是字段名稱,並且該值是字段值(作爲一個字符)。

更新:根據評論和@ nasufara的建議添加where子句,並添加IsLiteral根據@Jeff M's進行檢查。

+0

你當然不是故意傳入'null'嗎?或者是因爲他們的常量?你可以使用'GetFields(BindingFlags.Public)'no做得更好?你能限制它到'char'字段嗎? – mpen 2010-10-10 00:08:52

+0

@Mark,'BindingFlags.Public'是默認的,所以你不需要傳遞它。而且你總是爲'const'或'static'字段傳遞null(因爲參數指向一個沒有的實例*)。 – 2010-10-10 00:11:51

+2

在'.GetFields()'和'.ToDictionary(...)'之間插入'.Where(x => x.FieldType == typeof(char))'應該將其限制爲字符。 – mgbowen 2010-10-10 00:13:23

0
private class TypedEnum<T> : IEnumerable<T> 
{ 
    public IEnumerator<T> GetEnumerator() 
    { 
     return GetType().GetFields().Select(f => f.GetValue(null)).OfType<T>().GetEnumerator(); 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 
} 

private class Combinators : TypedEnum<char> 
{ 
    public const char DirectChild = '>'; 
    public const char NextAdjacent = '+'; 
    public const char NextSiblings = '~'; 
    public const char Descendant = ' '; 
} 

編輯:等等...有沒有辦法讓一個靜態的IEnumerable是嗎?