Я пытаюсь сократить расходы производительности вызова Activator.CreateInstance() на каждой итерации цикла следующего (упрощенно):Составитель Lambda и Activator.CreateInstance()
foreach (DataRow dr in chunk.Rows)
{
var objectToInsert = Activator.CreateInstance(type);
}
Основываясь на том, что Я прочитал, что лучше всего это сделать, чтобы собрать делегат и кешировать его. Это замедлит работу на первой итерации (в то время как делегат будет построен), но значительно улучшит производительность при последующих итерациях. Это приемлемо, так как я повторяю более 1000 раз. Чтобы еще больше усложнить ситуацию, я выполняю этот цикл параллельно, поэтому любой механизм кэширования должен быть потокобезопасным (ConcurentDictionary). Приведение метода в цикл в общий невозможен, так как тип, который я передаю в Activator.CreateInstance(), определяется выбором, сделанным пользователем через GUI и переданным моей функции. Для некоторых ссылок здесь является метод подписи:
public static void InsertByTable(IEnumerable<DataTable> chunkedTable, Type type)
Так что я хочу сделать что-то вроде как это (это псевдо-код):
private static readonly ConcurrentDictionary<Type, Func<object>> CachedConstructors =
new ConcurrentDictionary<Type, Func<object>>();
private static object CreateInstance(Type type)
{
if (type == null)
return;
var constructor = CachedConstructors.GetOrAdd(type, BuildInstance);
constructor(type);
}
private static Func<Type> BuildInstance(Type type)
{
}
Но я вроде в догадках, как на самом деле построить выражение или даже если это правильный подход.
Это будет зависеть от контекста, в котором вы ведете свой код, но если 'type' известно во время компиляции, вы можете изменить метод в родовой один, как' AddRows (...), где T: new() ', тогда вы могли бы просто использовать' new T() 'вместо' Activator.CreateInstance (...) '... –
Я обновляю сообщение, чтобы включить всю функцию. В настоящее время я передаю тип в качестве параметра, поскольку тип определяется на основе параметров, которые пользователи выбирают через графический интерфейс. – jdm5310