开发者

Getting value of an AutoProperty that has no getter using PropertyInfo.GetValue

I am trying to get the value of a string property in a unit test. The problem is that the property has no getter. The property is also declared as an AutoProperty and has no back开发者_如何转开发ing field.

I am trying to use PropertyInfo.GetValue(...) in the System.Reflection namespace. However I get System.ArgumentException : Property Get method was not found.

I do not own the code of that type so I am unable to add a getter to the property.

How does one get the value of such a property?


You would somehow need to find the backing field that was auto-generated by compiler using Reflection. And then, using its FieldInfo you will be able to read its value. And I am not sure if it is possible at all.

OK, I have the solution:

With following class,

public class TestClass
{
    public String TestProperty { private get; set; }
}

and following extension method,

public static class ObjectExtensions
{
    public static Object GetPropertyValue(this Object obj, String propertyName)
    {
        if (obj == null) throw new ArgumentNullException("obj", "`obj` cannot be null");

        var fields = from f in obj.GetType().GetFields(BindingFlags.Instance | BindingFlags.NonPublic)
                     where f.Name.Contains(String.Format("<{0}>", propertyName))
                     select f;

        if (fields.Any())
        {
            return fields.First().GetValue(obj);
        }

        return null;
    }
}

You can achieve what you want by using following code:

TestClass obj = new TestClass() { TestProperty = "Test Value" };
Object value = obj.GetPropertyValue("TestProperty"); // value = "Test Value"


The property will have a backing field, it's just that we don't know it's name (and it's name will not be a valid identifier). If this is for a one-off task, then you might do well to crack it open using .NET reflector and find the field that's being set by the setter.

I don't think there's anything you can do via Reflection (unless you want to parse the IL method body of the setter to find which field it's setting

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜