2016-06-09 46 views
0

我試圖只獲取某個類型的受保護屬性和公共屬性。這就是我目前正在做的如何通過c中的反射獲得受保護和公共屬性的唯一類型

var type = typeof(AClass); 
var propertyInfo = type.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance) 

但我想只過濾掉私人和內部屬性的公共和受保護的屬性。

有關如何去做這件事的任何建議?

+0

擺脫BindingFlags.Public'的'。 – theB

+0

@theB對不起,我修改了我的問題,我想得到保護和公共屬性的類型,但不是內部和私人。 – Anwuna

+0

您應該清楚自己想要做的是什麼,而不是通過在發佈答案後修改您的帖子來修改和無效答案。 – Rahul

回答

6

請注意,屬性包含get和set方法,並且它們可以具有不同的可訪問性(即,可以是公共的,其他可以被保護等)。此外,getter或setter可能會丟失(只能獲取或僅設置屬性)。爲了獲得性能無論哪裏獲取或設置方法得到保護,你可以這樣做:

typeof(AClass).GetProperties(BindingFlags.Instance | BindingFlags.NonPublic) 
    .Where(c => c.GetMethod != null && c.GetMethod.IsFamily || c.SetMethod != null && c.SetMethod.IsFamily).ToArray(); 

我也刪除BindingFlags.Public,但不是必需的 - 將很好地工作這一點。

如果你想獲得保護和公共屬性,只是修改了一下:

typeof(AClass).GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) 
    .Where(c => (c.GetMethod != null && (c.GetMethod.IsPublic || c.GetMethod.IsFamily)) || (c.SetMethod != null && (c.SetMethod.IsPublic || c.SetMethod.IsFamily))).ToArray(); 
-2

試試這個..

PropertyInfo[] props = someType.BaseType.GetProperties(
    BindingFlags.NonPublic | BindingFlags.Public 
    | BindingFlags.Instance | BindingFlags.Static) 

它將給定類型SOMETYPE的(公共+私有/保護/內部,靜態+實例)工作(也許使用的GetType()來獲取SOMETYPE)

1

只得到保護:

 var type = typeof(T); 

     var properties = type.GetProperties(BindingFlags.NonPublic); 

     var protectedOnly = properties.Where(info => info.GetMethod.IsFamily); 
+0

您的解決方案讓我走上了正軌。所以我正在投票。對原來的困惑抱歉。再次感謝。 – Anwuna

+0

沒問題,很樂意幫忙。 –

相關問題