如何获得一个类的属性列表?

我如何获得一个类的所有属性列表?

reflection; 举个例子:

obj.GetType().GetProperties(); 

对于一个types:

 typeof(Foo).GetProperties(); 

例如:

 class Foo { public int A {get;set;} public string B {get;set;} } ... Foo foo = new Foo {A = 1, B = "abc"}; foreach(var prop in foo.GetType().GetProperties()) { Console.WriteLine("{0}={1}", prop.Name, prop.GetValue(foo, null)); } 

反馈意见…

  • 要获取静态属性的值,请将null作为第一个parameter passing给GetValue
  • 要查看非公共属性,请使用(例如) GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance) (它将返回所有公共/私有实例属性)。

你可以使用reflection来做到这一点:(从我的图书馆 – 这得到的名称和值)

 public static Dictionary<string, object> DictionaryFromType(object atype) { if (atype == null) return new Dictionary<string, object>(); Type t = atype.GetType(); PropertyInfo[] props = t.GetProperties(); Dictionary<string, object> dict = new Dictionary<string, object>(); foreach (PropertyInfo prp in props) { object value = prp.GetValue(atype, new object[]{}); dict.Add(prp.Name, value); } return dict; } 

这个东西不适用于具有索引的属性 – 为此(它变得难以使用):

 public static Dictionary<string, object> DictionaryFromType(object atype, Dictionary<string, object[]> indexers) { /* replace GetValue() call above with: */ object value = prp.GetValue(atype, ((indexers.ContainsKey(prp.Name)?indexers[prp.Name]:new string[]{}); } 

此外,只获取公共属性:( 请参阅BindingFlags枚举的MSDN )

 /* replace */ PropertyInfo[] props = t.GetProperties(); /* with */ PropertyInfo[] props = t.GetProperties(BindingFlags.Public) 

这也适用于匿名types!
要获取名称:

 public static string[] PropertiesFromType(object atype) { if (atype == null) return new string[] {}; Type t = atype.GetType(); PropertyInfo[] props = t.GetProperties(); List<string> propNames = new List<string>(); foreach (PropertyInfo prp in props) { propNames.Add(prp.Name); } return propNames.ToArray(); } 

而对于这些值来说也是一样的,或者你可以使用:

  GetDictionaryFromType().Keys // or GetDictionaryFromType().Values 

但是,这可能会慢一点。

 public List<string> GetPropertiesNameOfClass(object pObject) { List<string> propertyList = new List<string>(); if (pObject != null) { foreach (var prop in pObject.GetType().GetProperties()) { propertyList.Add(prop.Name); } } return propertyList; } 

此function用于获取类属性的列表。

您可以使用System.Reflection命名空间与Type.GetProperties() mehod:

 PropertyInfo[] propertyInfos; propertyInfos = typeof(MyClass).GetProperties(BindingFlags.Public|BindingFlags.Static); 

你可以使用reflection。

 Type typeOfMyObject = myObject.GetType(); PropertyInfo[] properties =typeOfMyObject.GetProperties(); 

这是我的解决scheme

 public class MyObject { public string value1 { get; set; } public string value2 { get; set; } public PropertyInfo[] GetProperties() { try { return this.GetType().GetProperties(); } catch (Exception ex) { throw ex; } } public PropertyInfo GetByParameterName(string ParameterName) { try { return this.GetType().GetProperties().FirstOrDefault(x => x.Name == ParameterName); } catch (Exception ex) { throw ex; } } public static MyObject SetValue(MyObject obj, string parameterName,object parameterValue) { try { obj.GetType().GetProperties().FirstOrDefault(x => x.Name == parameterName).SetValue(obj, parameterValue); return obj; } catch (Exception ex) { throw ex; } } } 

我也面临着这样的要求。

从这个讨论中我得到了另一个想法,

 Obj.GetType().GetProperties()[0].Name 

这也显示了属性名称。

 Obj.GetType().GetProperties().Count(); 

这显示了一些属性。

谢谢大家。 这是很好的讨论。

基于@ MarcGravell的回答,这是一个在Unity C#中工作的版本。

 ObjectsClass foo = this; foreach(var prop in foo.GetType().GetProperties()) { Debug.Log("{0}={1}, " + prop.Name + ", " + prop.GetValue(foo, null)); } 

这里是改进的@lucasjones答案。 我在回答之后提出了评论部分提到的改进。 我希望有人会觉得这有用。

 public static string[] GetTypePropertyNames(object classObject, BindingFlags bindingFlags) { if (classObject == null) { throw new ArgumentNullException(nameof(classObject)); } var type = classObject.GetType(); var propertyInfos = type.GetProperties(bindingFlags); return propertyInfos.Select(propertyInfo => propertyInfo.Name).ToArray(); }