C # - извлечение значения свойства из дочернего класса - PullRequest
7 голосов
/ 02 ноября 2010

Я получаю доступ к значению свойства из объекта класса во время выполнения, используя отражение в C #.

    public bool GetValue(string fieldName, out object fieldValue)
    {
        // Get type of current record
        Type curentRecordType = _currentObject.GetType();
        PropertyInfo property = curentRecordType.GetProperty(fieldName);

        if (property != null)
        {
            fieldValue = property.GetValue(_currentObject, null).ToString();
            return true;
        }
        else
        {
            fieldValue = null;
            return false;
        }
    }

Я передаю Имя свойства как параметр: fieldName этому методу.Теперь мне нужно получить доступ к значению свойства из дочернего объекта вышеупомянутого класса во время выполнения.
Может кто-нибудь там подсказать, как мне получить доступ к значению свойства дочернего объекта?

Ответы [ 3 ]

7 голосов
/ 02 ноября 2010

Поскольку вы хотите иметь возможность находить объекты в произвольно вложенных дочерних объектах, вам нужна функция, которую вы можете вызывать рекурсивно.Это осложняется тем фактом, что у вас могут быть дети, которые ссылаются на своих родителей, поэтому вам нужно отслеживать, какие объекты вы уже видели в своем поиске.

static bool GetValue(object currentObject, string propName, out object value)
{
    // call helper function that keeps track of which objects we've seen before
    return GetValue(currentObject, propName, out value, new HashSet<object>());
}

static bool GetValue(object currentObject, string propName, out object value,
                     HashSet<object> searchedObjects)
{
    PropertyInfo propInfo = currentObject.GetType().GetProperty(propName);
    if (propInfo != null)
    {
        value = propInfo.GetValue(currentObject, null);
        return true;
    }
    // search child properties
    foreach (PropertyInfo propInfo2 in currentObject.GetType().GetProperties())
    {   // ignore indexed properties
        if (propInfo2.GetIndexParameters().Length == 0)
        {
            object newObject = propInfo2.GetValue(currentObject, null);
            if (newObject != null && searchedObjects.Add(newObject) &&
                GetValue(newObject, propName, out value, searchedObjects))
                return true;
        }
    }
    // property not found here
    value = null;
    return false;
}

Если вы знаете, какой ребенокобъект, в котором находится ваша собственность, вы можете просто передать ему путь, например:

public bool GetValue(string pathName, out object fieldValue) 
{ 
    object currentObject = _currentObject;
    string[] fieldNames = pathName.Split(".");

    foreach (string fieldName in fieldNames)
    {
        // Get type of current record 
        Type curentRecordType = currentObject.GetType(); 
        PropertyInfo property = curentRecordType.GetProperty(fieldName); 

        if (property != null) 
        { 
            currentObject = property.GetValue(currentObject, null).ToString(); 
        } 
        else 
        { 
            fieldValue = null; 
            return false; 
        } 
    }
    fieldValue = currentObject;
    return true; 
} 

Вместо того, чтобы называть его как GetValue("foo", out val), вы бы назвали его как GetValue("foo.bar", out val).

0 голосов
/ 02 ноября 2010
public void Main(){
    var containerObject = new ContainerObject();
    object propertyValue;
    object nestedPropertyValue;
    if(GetValue(containerObject, "FirstPropertyName", out propertyValue){
       bool success = GetValue(propertyValue, "NestedPropertyName", out nestedPropertyValue);
    } 

}

public bool GetValue(object currentObject, string propertyName, out object propertyValue)
{
    // Get type of current record
    var currentObjectType = currentObject.GetType();
    PropertyInfo propertyInfo = currentObjectType.GetProperty(propertyName);

    propertyValue = propertyInfo != null 
                    ?  propertyInfo.GetValue(currentObject,null)
                    :  null;
    return propertyValue == null;
}
0 голосов
/ 02 ноября 2010

Получите дочерний объект, используя отражение, затем используйте отражение, чтобы получить значение таким же образом.

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