Установить свойство объекта для свойства объекта с помощью отражения - PullRequest
0 голосов
/ 21 мая 2018

Я использовал this SO Вопрос для извлечения свойства объекта с использованием отражения.Свойство, которое я получил, является другим объектом, который имеет свойство с именем Value, к которому мне нужно получить доступ.Все потенциальные объекты, которые я извлекаю с помощью отражения, происходят из одного класса EntityField и поэтому все имеют свойство Value.Я видел этот ТАК вопрос, который намекал на то, как я мог бы получить доступ к свойству Value, но я не мог составить правильный код.Как получить доступ к свойству Value объекта, полученного с помощью отражения?

Мои попытки

var parent = entity.GetType().GetProperty("Property");
parent.GetType().GetProperty("Value").SetValue(parent, newValue);  // parent.GetType() is null
(parent as EntityField<T>).Value = newValue;  // Not sure how to dynamically set T since it could be any system type

Main (оригинальный код)

private static void SetValues(JObject obj, EntityBase entity)
{
    // entity.GetType().GetProperty("Property") returns an EntityField Object
    // I need to set EntityField.Value = obj["Value"] 
    // Current code sets EntityField = obj["Value"] which throws an error
    entity.GetType().GetProperty("Property").SetValue(entity, obj["Value"], null);
}

EntityField

public class EntityField<T> : EntityFieldBase
{
    private Field _Field;
    private T _Value;

    public EntityField(Field field, T value){
        this._Field = field;
        this._Value = value;
    }

    public Field Field
    {
        get
        {
            return this._Field;
        }
        set
        {
            if (this._Field != value)
            {
                this._Field = value;
            }
        }
    }

    public T Value
    {
        get
        {
            return this._Value;
        }
        set
        {
            if (!EqualityComparer<T>.Default.Equals(this._Value, value))
            {
                this._Value = value;
                this._IsDirty = true;
            }
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Попробовал следующее в LinqPad и все заработало ...

class TestChild<T>
{
    public T ChildProperty { get; set; }
}

class TestParent<T>
{ 
    public TestChild<T> ParentProperty { get; set; }    
}

void Main()
{
    var instance = new TestParent<string>
    {
        ParentProperty = new TestChild<string>()
    };

    instance.GetType()
            .GetProperty("ParentProperty")
            .GetValue(instance)
            .GetType()
            .GetProperty("ChildProperty")
            .SetValue(instance.ParentProperty, "Value");

    Console.WriteLine(instance.ParentProperty.ChildProperty);
}
0 голосов
/ 21 мая 2018

Попробуйте это:

entity.GetType().GetProperty("Value").SetValue(entity, obj["Value"], null);

Необходимо указать имя свойства в методе GetProperty ().Я подозреваю, что не было такого свойства под названием «Свойство»:)

Редактировать: После прочтения ваших комментариев попробуйте

entity.Property.GetType().GetProperty("Value").SetValue(entity, obj["Value"], null);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...