2013-04-01 63 views
17

我有一個派生自抽象類的類。獲取派生類的類型我想知道哪些屬性是從抽象類繼承的,哪些屬性是派生類中聲明的。如何找出屬性是從基類繼承還是在派生中聲明?

public abstract class BaseMsClass 
{ 
    public string CommonParam { get; set; } 
} 

public class MsClass : BaseMsClass 
{ 
    public string Id { get; set; } 
    public string Name { get; set; } 

    public MsClass() 
    { } 
} 

var msClass = new MsClass 
{ 
    Id = "1122", 
    Name = "Some name", 
    CommonParam = "param of the base class" 
}; 

所以,我想快速找出CommonParam是一個繼承參數和ID,名稱是在MsClass中聲明的參數。有什麼建議麼?

試圖使用只能聲明標誌返回我空的PropertyInfo數組

Type type = msClass.GetType(); 
type.GetProperties(System.Reflection.BindingFlags.DeclaredOnly) 

-->{System.Reflection.PropertyInfo[0]} 

然而,的GetProperties()返回繼承層次結構的所有屬性。

type.GetProperties() 

-->{System.Reflection.PropertyInfo[3]} 
-->[0]: {System.String Id} 
-->[1]: {System.String Name} 
-->[2]: {System.String CommonParam} 

我錯過了什麼嗎?

回答

26

您可以指定Type.GetProperties(BindingFlags.DeclaredOnly)以獲取在派生類中定義的屬性。如果您然後在基類上調用GetProperties,則可以獲得在基類中定義的屬性。


爲了獲取從你的類的公共屬性,你可以這樣做:

var classType = typeof(MsClass); 
var classProps = classType.GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public); 
var inheritedProps = classType.BaseType.GetProperties(BindingFlags.Public | BindingFlags.Instance); 
+3

不知何故,這種方法沒有給出預期的結果。問題已更新。 – Maxim

+2

@Maxim你需要'type.GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public)'。 +1給裏德,希望他會更新回答一下 –

+0

@Maxim增加了一些代碼... –

10

您可以檢查基礎上,​​如下:

var pros = typeof(MsClass).GetProperties() 
          .Where(p => p.DeclaringType == typeof(MsClass)); 

就可以獲得性能你可以調用類似的基類:

var pros = typeof(MsClass).GetProperties() 
          .Where(p => p.DeclaringType == typeof(BaseMsClass)); 
3

這可能有所幫助:

Type type = typeof(MsClass); 

Type baseType = type.BaseType; 

var baseProperties = 
    type.GetProperties() 
      .Where(input => baseType.GetProperties() 
            .Any(i => i.Name == input.Name)).ToList(); 
+0

+1肯定的作品,雖然不是很優雅。預計應該已經實施一些內容來支持所需的請求。 – Maxim

相關問題