简体   繁体   English

如何通过Reflection获取字符串属性的值?

[英]How can I get the value of a string property via Reflection?

public class Foo
{
   public string Bar {get; set;}
}

How do I get the value of Bar, a string property, via reflection? 如何通过反射获得字符串属性Bar的值? The following code will throw an exception if the PropertyInfo type is a System.String 如果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
}

It seems that my problem is that the property is an indexer type, with a System.String. 看来我的问题是该属性是一个索引器类型,带有System.String。

Also, how do I tell if the property is an indexer? 另外,如何判断该属性是否为索引器?

You can just get the property by name: 您可以按名称获取酒店:

Foo f = new Foo();
f.Bar = "Jon Skeet is god.";

var barProperty = f.GetType().GetProperty("Bar");
string s = barProperty.GetValue(f,null) as string;

Regarding the follow up question: Indexers will always be named Item and have arguments on the getter. 关于后续问题:索引器将始终命名为Item并在getter上有参数。 So 所以

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

I couldn't reproduce the issue. 我无法重现这个问题。 Are you sure you're not trying to do this on some object with indexer properties? 你确定你没有尝试使用索引器属性在某个对象上执行此操作吗? In that case the error you're experiencing would be thrown while processing the Item property. 在这种情况下,处理Item属性时会抛出您遇到的错误。 Also, you could do this: 此外,你可以这样做:


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");
Foo f = new Foo();
f.Bar = "x";

string value = (string)f.GetType().GetProperty("Bar").GetValue(f, null);
var val = f.GetType().GetProperty("Bar").GetValue(f, null);
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
}

And here is for the followup: 以下是后续行动:

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;
    }
}

Its easy to get property value of any object by use Extension method like: 通过使用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);
        }
    }

Usage is: 用法是:

Foo f = new Foo();
f.Bar = "x";
var balbal = f.GetPropertyValue("Bar");
PropertyInfo propInfo = f.GetType().GetProperty("Bar");
object[] obRetVal = new Object[0];
string bar = propInfo.GetValue(f,obRetVal) as string;

the getvalue with object and null worked great for me. 带有object和null的getvalue对我来说很有用。 Thanks for the posts. 谢谢你的帖子。

Context: Looping through all properties in an MVC model for New Hires and determining their form posted values: 上下文:在New Hires的MVC模型中循环遍历所有属性并确定其表单发布值:

newHire => the Model, with many properties, whose posted form values I want to write individually to a set of database records newHire =>模型,具有许多属性,其发布的表单值我想单独写入一组数据库记录

foreach(var propertyValue in newHire.GetProperties())
{
string propName = propertyValue.Name;

string postedValue = newHire.GetType().GetProperty(propName).GetValue(newHire, null).ToString();

}

To get the property names of the object by just passing the object you can use this function may this works. 要通过传递对象来获取对象的属性名称,可以使用此函数,这可能有效。

just make object object a class and pass into it. 只需使对象对象成为一个类并传入它。

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

    }

But this will only work when the object properties are "Public" 但这仅在对象属性为“公共”时才有效

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM