2014-02-26 45 views
1

我需要列出包含類的所有屬性,我有很多它們,所以我不知道代碼中的類型,但我可以通過prop.BastType.FullName ,但我無法施展它,而且我不想改變我所有的課程,以便每個人都能創作出「演員」方法。 爲了避免打印物業屬性,如DeclaringType,ReflectedType,等等,我不包括他們的代碼,但我不喜歡這樣......在C中獲取BaseType屬性和反射#

if (("DeclaringType,ReflectedType,MetadataToken,Module,PropertyType,Attributes,CanRead" + 
        ",CanWrite,GetMethod,SetMethod,IsSpecialName,CustomAttributes,MemberType") 
        .Contains(prop.Name)) 
        continue; 

方法的全碼:

private static void GetAllPropertiesFor(object oo, int level, List<KeyValuePair<string,string>> result) 
{ 
    Type entType = oo.GetType(); 
    IList<PropertyInfo> props = new List<PropertyInfo>(entType.GetProperties()); 
    foreach (PropertyInfo prop in props) 
    { 
     object propValue = prop.GetValue(oo, null); 
     if (("DeclaringType,ReflectedType,MetadataToken,Module,PropertyType,Attributes,CanRead" + 
      ",CanWrite,GetMethod,SetMethod,IsSpecialName,CustomAttributes,MemberType") 
      .Contains(prop.Name)) 
      continue; 
     if (propValue == null) 
     { 
      result.Add(new KeyValuePair<string, string>((new string(' ', level * 2)) + prop.Name, "Object")); 
      //GetAllPropertiesFor(prop, level + (1*3), result); 
     } 
     else 
     { 
      if (result == null) result = new List<KeyValuePair<string, string>>(); 
      result.Add(new KeyValuePair<string, string>((new string(' ', level)) + prop.Name, propValue.ToString())); 
     } 
     if (entType.Namespace == "System.Data.Entity.DynamicProxies" && entType.BaseType.FullName.StartsWith("RE2012.Data.Models.")) 
     { 
      GetAllPropertiesFor(prop, level + 1, result); 
     } 
     // Do something with propValue 
    } 
} 

有什麼建議嗎?

這樣,我不結果有,值:

PropertyType : System.Int32 
Attributes : None 
CanRead : True 
CanWrite : True 

正是我需要的。

+2

我不能工作出了問題是什麼。 –

回答

1

不負我真的不能工作了,你要什麼,所以這個答案只是在黑暗中

基於我想我明白你想從一個特定的類屬性射門所以這裏是我的例子:

首先我一樣的繼承

class BaseClass 
{ 
    public int Base { get; set; } 
} 
class ChildClass : BaseClass 
{ 
    public double Child { get; set; } 
} 
class ChildChildClass : ChildClass 
{ 
    public string ChildChild { get; set; } 
} 

現在可以找到單一屬性

class Program 
{ 

    static void Main(string[] args) 
    { 
     var obj = new ChildChildClass(); 

     var ChildChildType = obj.GetType(); 

     var p = new Program(); 

     // here we get the ChildClass properties 
     var t = p.getBaseType(ChildChildType, 1); 
     Console.WriteLine(t.Name); 
     p.getproperties(t); 

     // here we get the BaseClass properties 
     t = p.getBaseType(ChildChildType, 2); 
     Console.WriteLine(t.Name); 
     p.getproperties(t); 

     // here we get the Object properties 
     t = p.getBaseType(ChildChildType, 3); 
     Console.WriteLine(t.Name); 
     p.getproperties(t); 

     Console.Read(); 
    } 

    internal Type getBaseType(Type t, int level) 
    { 
     Type temp ; 
     for (int i = 0; i < level; i++) 
     { 
      temp = t.BaseType; 
      if(temp == null) 
       throw new ArgumentOutOfRangeException("you are digging to deep"); 
      else 
       t = temp; 
     } 

     return t; 
    } 

    private void getproperties(Type t) 
    { 
     PropertyInfo[] properties = t.GetProperties(BindingFlags.DeclaredOnly | 
                BindingFlags.Public | 
                BindingFlags.Instance); 

     foreach (PropertyInfo property in properties) 
     { 
      Console.WriteLine(property.Name); 
     } 

     Console.WriteLine(""); 
    } 
} 

,如果你想了解的BindingFlags這裏的一些信息是Link