С#: как установить свойство, имеющее тип значения, с помощью отражения без упаковки или распаковки?

Я нахожусь в ситуации, когда мне нужно гидратировать большое количество DTO различных классов, используя отражение, но я хотел бы избежать упаковки и распаковки, которые снижают производительность. Есть идеи как?

Пример для иллюстрации:

    public class Person {
      public int Age { get; set; }
    }
    var person = new Person();
    var ageProp = typeof(Person).GetProperty("Age");
    ageProp.SetValue(person , 13); // Causes boxing!!

ИЗМЕНИТЬ

Вот лучший пример:

public void CreateAndHydrateEntity(Type entityType, List<(string PropName, int PropIndex) properties, SqlDataReader reader) {
    var entity = Activator.CreateInstance(entityType);
    foreach(var (propName, index) in properties) {
        var prop = entityType.GetProperty(propName);
        prop.SetValue(entity, reader[index]); // Causes boxing!!
    }
}

person Ahmad Akra    schedule 17.07.2019    source источник
comment
зачем вам это? Каков ваш вариант использования? Вы уверены, что это вредит производительности?   -  person mtkachenko    schedule 17.07.2019
comment
Если вы создаете такого человека var person = new Person() зачем вам рефлексия?   -  person mtkachenko    schedule 17.07.2019
comment
Я рекомендую вам искать скомпилированные выражения. Вы можете скомпилировать сеттеры/геттеры во время выполнения один раз, кэшировать их, а затем использовать напрямую. Это заметно улучшит производительность по сравнению с обычным отражением.   -  person Sohaib Jundi    schedule 17.07.2019
comment
Если вам нужно обновить различные классы, пусть все эти классы реализуют интерфейс, скажем, IAge и тогда вы сможете обновлять через этот интерфейс, без всякого отражения/упаковки.   -  person Dmitry Bychenko    schedule 17.07.2019
comment
@mtkachenko Я создаю мини ORM специального назначения, который загружает данные из базы данных SQL и увлажняет с их помощью объекты C #. Итак, я знаю имя свойства, тип свойства и, когда свойство имеет тип значения (например, int), я бы хотел, чтобы был способ установить его без этой распаковки.   -  person Ahmad Akra    schedule 17.07.2019
comment
@AAkra, сначала попробуйте github.com/StackExchange/Dapper   -  person mtkachenko    schedule 17.07.2019
comment
Возможный дубликат Могу ли я установить значение на структуру через отражение без бокса?   -  person colosso    schedule 17.07.2019
comment
Возможно, вы захотите вызвать соответствующий метод для SqlDataReader. От методов GetInt32 к методам GetTimeSpan. Вы знаете тип, вы знаете, что звонить.   -  person dropoutcoder    schedule 17.07.2019
comment
@colosso это не дубликат, этот вопрос касается установки свойства в структуре с использованием отражения, я имею дело с обычным классом, где само свойство является типом значения   -  person Ahmad Akra    schedule 17.07.2019
comment
@dropoutcoder спасибо, да, я могу использовать GetXXX для получения значения в его правильном типе, но тогда возникает вопрос: как установить свойство с этим значением без распаковки   -  person Ahmad Akra    schedule 17.07.2019
comment
Получите метод set вашего свойства, создайте делегата, используя этот метод, и вызовите его. Но если вы не можете привести этот делегат к точному типу, вы просто подтолкнули бокс на один уровень вверх.   -  person thehennyy    schedule 17.07.2019
comment
Хорошо, оказывается, что не упаковка/распаковка вызывала снижение производительности, а само отражение, я получаю такое же снижение производительности даже при установке ссылочных типов, поэтому мне нужно найти способ обойти отражение при гидратации. мои объекты, я рассмотрю некоторые из методов, предложенных выше (например, скомпилированные выражения)   -  person Ahmad Akra    schedule 17.07.2019
comment
Я думаю, вы можете кэшировать отраженные свойства для каждого типа, чтобы повысить производительность. Я предполагаю, что эти типы не изменяются во время выполнения и, возможно, они имеют базовый тип. Вы можете рано заняться тяжелой атлетикой. Также использование прототипа для этих типов может помочь повысить производительность, чтобы избежать вызова метода Activator.CreateInstance, но я не уверен, что это имеет разумное значение.   -  person dropoutcoder    schedule 18.07.2019