C # получить поля с отражением - PullRequest
2 голосов
/ 31 августа 2011

В C # как вы используете отражение, чтобы получить переменные, которые не имеют геттеров / сеттеров?Например, приведенный ниже метод getValue будет работать для d2, но не для d1.

public class Foo {

    public String d1;
    public String d2 { get; set; }

    public object getValue(String propertyName){
        return this.GetType().GetProperty(propertyName).GetValue(this, null);
    }
}

Ответы [ 3 ]

9 голосов
/ 31 августа 2011

d1 не является собственностью. Это поле. Вместо этого используйте методы отражения для полей.

public class Foo {

    public String d1;
    public String d2 { get; set; }

    public object getValue(String propertyName){
        var member = this.GetType().GetMember(propertyName).Single();
        if (member is PropertyInfo)
        {
            return ((PropertyInfo)member).GetValue(this, null);
        }
        else if (member is FieldInfo)
        {
            return ((FieldInfo)member).GetValue(this);
        }
        else throw new ArgumentOutOfRangeException();
    }
}
4 голосов
/ 31 августа 2011

d1 не является собственностью.Это поле.Вы можете использовать this.GetType().GetField, чтобы получить его с помощью отражения.

public object getFieldValue(String fieldName){
    return this.GetType().GetField(fieldName).GetValue(this);
}

Вероятно, вы пытаетесь заставить getValue возвращать значение свойства или поля.Вы можете использовать GetMember, чтобы сказать вам, является ли это свойство или поле.Например:

public object getValue(String memberName) {
    var member = this.GetType().GetMember(memberName).Single();
    if (member.MemberType == MemberTypes.Property) {
         return ((PropertyInfo)member).GetValue(this, null);
    }
    if (member.MemberType == MemberTypes.Field) {
        return ((FieldInfo)member).GetValue(this);
    }
    else
    {
        throw new Exception("Bad member type.");
    }
}
1 голос
/ 31 августа 2011

Вы должны использовать метод GetField.

Msdn: Type.GetField ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...