关于c#:如何通过Reflection获取字符串属性的值?

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
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)*/});
}


我无法复制这个问题。您确定不想在具有索引器属性的对象上执行此操作吗?在这种情况下,您遇到的错误将在处理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
Foo f = new Foo();
f.Bar ="x";
var balbal = f.GetPropertyValue("Bar");


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();

}