How to get the list of properties of a class?
如何获取类的所有属性的列表?
反射;例如:
1 | obj.GetType().GetProperties(); |
类型:
1 |
例如:
1 2 3 4 5 6 7 8 9 | 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 作为第一个参数传递给GetValue 。 - 要查看非公共属性,请使用(例如)
GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance) (它返回所有公共/私有实例属性)。
您可以使用反射来执行此操作:(从我的库中-获取名称和值)
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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; } |
对于有索引的属性,此功能不起作用-因为(它变得越来越笨拙):
1 2 3 4 5 6 | 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)
1 2 3 4 | /* replace */ PropertyInfo[] props = t.GetProperties(); /* with */ PropertyInfo[] props = t.GetProperties(BindingFlags.Public) |
这也适用于匿名类型!只想知道名字:
1 2 3 4 5 6 7 8 9 10 11 12 | 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(); } |
对于值来说几乎是一样的,或者你可以使用:
1 2 3 | GetDictionaryFromType().Keys // or GetDictionaryFromType().Values |
但我想那会慢一点。
1 2 3 4 5 6 7 8 9 10 11 12 | 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; } |
此函数用于获取类属性列表。
您可以将
1 2 | PropertyInfo[] propertyInfos; propertyInfos = typeof(MyClass).GetProperties(BindingFlags.Public|BindingFlags.Static); |
根据@marcgravel的答案,这里有一个版本在Unity C中工作。
1 2 3 4 | ObjectsClass foo = this; foreach(var prop in foo.GetType().GetProperties()) { Debug.Log("{0}={1}," + prop.Name +"," + prop.GetValue(foo, null)); } |
那是我的解决办法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | 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; } } } |
你可以使用反射。
1 2 | Type typeOfMyObject = myObject.GetType(); PropertyInfo[] properties =typeOfMyObject.GetProperties(); |
这里是改进的@lucasjones答案。在他的回答之后,我在评论部分提到了一些改进。我希望有人会发现这个有用。
1 2 3 4 5 6 7 8 9 10 11 12 | 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(); } |
我也面临这样的要求。
从这次讨论中我得到了另一个想法,
1 | Obj.GetType().GetProperties()[0].Name |
这也显示属性名。
1 | Obj.GetType().GetProperties().Count(); |
显示属性的数量。
谢谢大家。这是个不错的讨论。