Если у вас есть параметр универсального типа, то ответ Джеффа Бриджмена - лучший.
Если у вас есть только объект Type, представляющий тип, который вы хотите создать, вы можете использовать Activator.CreateInstance(Type)
, как предложил Алекс Лайман, но мне сказали, что он медленный (хотя я не профилировал его лично).
Однако, если вы обнаружите, что создаете эти объекты очень часто, есть более красноречивый подход с использованием динамически скомпилированных выражений Linq:
using System;
using System.Linq.Expressions;
public static class TypeHelper
{
public static Func<object> CreateDefaultConstructor(Type type)
{
NewExpression newExp = Expression.New(type);
// Create a new lambda expression with the NewExpression as the body.
var lambda = Expression.Lambda<Func<object>>(newExp);
// Compile our new lambda expression.
return lambda.Compile();
}
}
Просто позвони делегату, который вернулся к тебе. Вы должны кэшировать этот делегат, потому что постоянная перекомпиляция выражений Linq может быть дорогой, но если вы кэшируете делегат и повторно используете его каждый раз, это может быть очень быстро! Я лично использую статический словарь поиска, проиндексированный по типу. Эта функция полезна, когда вы имеете дело с сериализованными объектами, где вы можете знать только информацию типа.
ПРИМЕЧАНИЕ. Это может произойти сбой, если тип не может быть создан или не имеет конструктора по умолчанию!