How can I get the value of a string property via Reflection?
1 2 3 4 | public class Foo { public string Bar {get; set;} } |
如何通过反射获取条形(字符串属性)的值?如果propertyinfo类型为System.String,则以下代码将引发异常
1 2 3 4 5 6 7 | Foo f = new Foo(); f.Bar ="Jon Skeet is god."; foreach(var property in f.GetType().GetProperties()) { object o = property.GetValue(f,null); //throws exception TargetParameterCountException for String type } |
号
我的问题似乎是属性是带System.String的索引器类型。
另外,如何判断属性是否是索引器?
您只需按名称获取属性:
1 2 3 4 5 | Foo f = new Foo(); f.Bar ="Jon Skeet is god."; var barProperty = f.GetType().GetProperty("Bar"); string s = barProperty.GetValue(f,null) as string; |
。
关于后续问题:索引器将始终命名为item并在getter上具有参数。所以
1 2 3 4 5 6 7 8 |
我无法复制这个问题。您确定不想在具有索引器属性的对象上执行此操作吗?在这种情况下,您遇到的错误将在处理item属性时引发。此外,您还可以这样做:
1 2 3 4 5 6 7 | public static T GetPropertyValue<T>(object o, string propertyName) { return (T)o.GetType().GetProperty(propertyName).GetValue(o, null); } ...somewhere else in your code... GetPropertyValue<string>(f,"Bar"); |
1 | var val = f.GetType().GetProperty("Bar").GetValue(f, null); |
。
1 2 3 4 | Foo f = new Foo(); f.Bar ="x"; string value = (string)f.GetType().GetProperty("Bar").GetValue(f, null); |
。
1 2 3 4 5 6 7 8 9 10 11 | Foo f = new Foo(); f.Bar ="Jon Skeet is god."; foreach(var property in f.GetType().GetProperties()) { if(property.Name !="Bar") { continue; } object o = property.GetValue(f,null); //throws exception TargetParameterCountException for String type } |
下面是以下内容:
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 | class Test { public class Foo { Dictionary<string, int> data =new Dictionary<string,int>(); public int this[string index] { get { return data[index]; } set { data[index] = value; } } public Foo() { data["a"] = 1; data["b"] = 2; } } public Test() { var foo = new Foo(); var property = foo.GetType().GetProperty("Item"); var value = (int)property.GetValue(foo, new object[] {"a" }); int i = 0; } } |
号
使用如下扩展方法可以很容易地获得任何对象的属性值:
1 2 3 4 5 6 7 | public static class Helper { public static object GetPropertyValue(this object T, string PropName) { return T.GetType().GetProperty(PropName) == null ? null : T.GetType().GetProperty(PropName).GetValue(T, null); } } |
用法是:
1 2 3 |
。
1 2 3 | PropertyInfo propInfo = f.GetType().GetProperty("Bar"); object[] obRetVal = new Object[0]; string bar = propInfo.GetValue(f,obRetVal) as string; |
要通过传递对象来获取对象的属性名,可以使用此函数来实现这一点。
只需将对象对象设为类并传递给它。
1 2 3 4 5 6 7 8 9 10 11 | public void getObjectNamesAndValue(object obj) { Type type = obj.GetType(); BindingFlags flags = BindingFlags.Public | BindingFlags.Instance; PropertyInfo[] prop = type.GetProperties(flags); foreach (var pro in prop) { System.Windows.Forms.MessageBox.Show("Name :" + pro.Name +" Value :"+ pro.GetValue(obj, null).ToString()); } } |
号
但这只在对象属性为"public"时才有效。
带有object和null的getValue对我很有用。谢谢你的帖子。
上下文:为新雇员循环遍历MVC模型中的所有属性,并确定其表单发布值:
newhire=>模型,有许多属性,我想将它们的已发布表单值单独写入一组数据库记录中
1 2 3 4 5 6 7 | foreach(var propertyValue in newHire.GetProperties()) { string propName = propertyValue.Name; string postedValue = newHire.GetType().GetProperty(propName).GetValue(newHire, null).ToString(); } |
。