Wenn Sie den generischen Typparameter haben, ist Jeff Bridgmans Antwort die beste. Wenn Sie nur ein Type-Objekt haben, das den Typ darstellt, den Sie erstellen möchten, können Sie es Activator.CreateInstance(Type)
wie von Alex Lyman vorgeschlagen verwenden, aber mir wurde gesagt, dass es langsam ist (ich habe es jedoch nicht persönlich profiliert).
Wenn Sie diese Objekte jedoch sehr häufig konstruieren, gibt es einen eloquenteren Ansatz, bei dem dynamisch kompilierte Linq-Ausdrücke verwendet werden:
using System;
using System.Linq.Expressions;
public static class TypeHelper
{
public static Func<object> CreateDefaultConstructor(Type type)
{
NewExpression newExp = Expression.New(type);
var lambda = Expression.Lambda<Func<object>>(newExp);
return lambda.Compile();
}
}
Rufen Sie einfach den an Sie zurückgegebenen Delegierten an. Sie sollten diesen Delegaten zwischenspeichern, da das ständige Neukompilieren von Linq-Ausdrücken teuer sein kann. Wenn Sie den Delegaten jedoch zwischenspeichern und jedes Mal wiederverwenden, kann dies sehr schnell gehen! Ich persönlich verwende ein statisches Suchwörterbuch, das nach Typ indiziert ist. Diese Funktion ist nützlich, wenn Sie mit serialisierten Objekten arbeiten, bei denen Sie möglicherweise nur die Typinformationen kennen.
HINWEIS: Dies kann fehlschlagen, wenn der Typ nicht konstruierbar ist oder keinen Standardkonstruktor hat!