public class Foo
{
public string Bar {get; set;}
}
如何通过反射获取字符串属性Bar的值?如果PropertyInfo类型是System.String
,则以下代码将引发异常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。
另外,如何判断该属性是否为索引器?
答案 0 :(得分:45)
您可以按名称获取该物业:
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上具有参数。 所以
Foo f = new Foo();
f.Bar = "Jon Skeet is god.";
var barProperty = f.GetType().GetProperty("Item");
if (barProperty.GetGetMethod().GetParameters().Length>0)
{
object value = barProperty.GetValue(f,new []{1/* indexer value(s)*/});
}
答案 1 :(得分:5)
我无法重现这个问题。你确定你没有尝试使用索引器属性在某个对象上执行此操作吗?在这种情况下,处理Item属性时会抛出您遇到的错误。 此外,你可以这样做:
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");
答案 2 :(得分:4)
Foo f = new Foo();
f.Bar = "x";
string value = (string)f.GetType().GetProperty("Bar").GetValue(f, null);
答案 3 :(得分:4)
var val = f.GetType().GetProperty("Bar").GetValue(f, null);
答案 4 :(得分:3)
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
}
以下是后续内容:
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;
}
}
答案 5 :(得分:2)
PropertyInfo propInfo = f.GetType().GetProperty("Bar");
object[] obRetVal = new Object[0];
string bar = propInfo.GetValue(f,obRetVal) as string;
答案 6 :(得分:2)
使用Extension方法很容易获得任何对象的属性值,如:
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);
}
}
用法是:
Foo f = new Foo();
f.Bar = "x";
var balbal = f.GetPropertyValue("Bar");
答案 7 :(得分:0)
带有object和null的getvalue对我来说很有用。感谢您的帖子。
上下文:在New Hires的MVC模型中循环遍历所有属性并确定其表单发布值:
newHire =&gt;模型,具有许多属性,其发布的表单值我想单独写入一组数据库记录
foreach(var propertyValue in newHire.GetProperties())
{
string propName = propertyValue.Name;
string postedValue = newHire.GetType().GetProperty(propName).GetValue(newHire, null).ToString();
}
答案 8 :(得分:0)
要通过仅传递对象来获取对象的属性名称,可以使用此功能,这可能会奏效。
只需将object object设为一个类并传递给它即可。
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());
}
}
但这仅在对象属性为“公共”时有效