В большинстве случаев: более чем достаточно быстро. Например, если вы используете это для создания объекта-оболочки DAL, время, затраченное на создание объекта с помощью отражения, будет минус по сравнению со временем, которое необходимо для подключения к сети. Поэтому оптимизация была бы пустой тратой времени.
Если вы используете отражение в замкнутом цикле, есть способы улучшить его:
- генерики (с использованием обертки
where T : new()
и MakeGenericType
)
Delegate.CreateDelegate
(типизированному делегату; не работает для конструкторов)
Reflection.Emit
- хардкор
Expression
(как и Delegate.CreateDelegate
, но более гибкий и работает для конструкторов)
Но для ваших целей, CreateInstance
отлично подойдет. Придерживайтесь этого, и будьте проще.
Редактировать: пока сохраняется вопрос об относительной эффективности, и хотя остается самое важное, «измерить его», я должен пояснить некоторые из вышеперечисленных. Иногда ... это имеет значение . Измерьте в первую очередь. Однако, если вы обнаружите, что слишком медленный , вы можете посмотреть на что-то вроде FastMember , который выполняет весь код Reflection.Emit
в фоновом режиме, чтобы дать вам хороший простой API; например:
var accessor = TypeAccessor.Create(type);
List<object> results = new List<object>();
foreach(var row in rows) {
object obj = accessor.CreateNew();
foreach(var col in cols) {
accessor[obj, col.Name] = col.Value;
}
results.Add(obj);
}
что просто, но будет очень быстро. В конкретном примере, который я упоминаю об оболочке DAL - если вы делаете это много, рассмотрите что-то вроде dapper , который снова выполняет весь код Reflection.Emit
в фоновом режиме, чтобы дать вам самый быстрый из возможных, но легкий используйте API:
int id = 12345;
var orders = connection.Query<Order>(
"select top 10 * from Orders where CustomerId = @id order by Id desc",
new { id }).ToList();