2016-08-24 26 views
0

我有一類名爲MyClass的其中有許多特性如何在C#打印類的道具名稱

class MyClass 
{ 
    public int Id { get; set; } 

    public string Name { get; set; } 

    public string email { get; set; } 

    public string password { get; set; } 

    public string city { get; set; } 
} 

我想在Console.writeline打印屬性名稱,如

static void Main(string[] args) 
    { 
     MyClass m = new MyClass(); 
     var s = m.GetType() 
       .GetFields(); 
     Console.WriteLine(s); 



     Console.ReadKey(); 
    } 

但它給我的每一次

System.Reflection.FieldInfo[] 

請告訴我,我怎麼能做到這一點我也可以做到這一點或不

+0

您正在嘗試打印出一組對象,您會期望做什麼? – DavidG

+1

'Console.WriteLine(string.Join(「,」,s));' – itsme86

+0

這將打印出*字段的名稱*,**而不是屬性。 – EJoshuaS

回答

5

雖然它們在語法上看起來很相似,但屬性不是字段。使用GetProperties代替:

var props = m.GetType().GetProperties(); 

var props = typeof(MyClass).GetProperties(); 

印刷應該這樣做:

foreach (var p in props) { 
    Console.WriteLine(p.Name); 
} 
+0

建議使用typeof來避免實例化類型 – MikeT

3

,如果你使用的是C#6,現在有一個很好的nameof關鍵字

nameof(email) returns "email" 

那麼他們是可以連接到一個方法調用作爲這樣

public void MemberName([System.Runtime.CompilerServices.CallerMemberName] string memberName = "") 

較早CallerMemberName屬性,那麼你必須反思

Console.WriteLine("Properties of System.Type are:"); 
foreach (PropertyInfo myPropertyInfo in typeof(MyClass).GetProperties()) 
{ 
    Console.WriteLine(myPropertyInfo.ToString()); 
} 
0

其他人也有類似的答案,我知道,但我只是想補充一個其他幾個項目。第一個代碼:

IEnumerable<string> names = typeof(MyClass).GetProperties().Select(prop => prop.Name); 

foreach (var name in names) 
{ 
    Console.WriteLine(name); 
} 

正如其他人指出的那樣,您對這裏的屬性感興趣(不是字段)。如果我將GetProperties()調用更改爲GetFields(),它將返回一個空集合。但是,如果我將其更改爲GetFields(BindingFlags.NonPublic | BindingFlags.Instance),它會給我支持字段的名稱(我懷疑它不是您要查找的名稱)。

我想補充的另一件事是,ToString()並不總是做你期待的。在很多情況下(比如上面的),你只需要獲得類型名稱(而不是的內容)。作爲推論,你通常不能僅僅通過ToString()來獲取一個表示集合中所有項目的連接值的字符串。如果你想要的話,你可以寫一個擴展方法來做到這一點。