Wenn Sie den generischen Typparameter haben, dann ist die Antwort von Jeff Bridgman die beste. Wenn Sie nur ein Type-Objekt haben, das den Typ darstellt, den Sie konstruieren möchten, könnten Sie Activator.CreateInstance(Type)
verwenden, wie Alex Lyman vorgeschlagen hat, aber mir wurde gesagt, dass es langsam ist (ich habe es jedoch nicht persönlich profiliert).
Wenn Sie jedoch selbst diese Objekte konstruieren finden sehr häufig gibt es einen beredter Ansatz dynamisch kompiliert Linq-Ausdrücke verwenden:
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();
}
}
Rufen Sie die Delegierten an Sie zurückgeschickt. Sie sollten diesen Delegaten zwischenspeichern, da das wiederholte Neukompilieren von Linq-Ausdrücken teuer sein kann, aber wenn Sie den Delegat zwischenspeichern und jedes Mal erneut verwenden, kann er sehr schnell sein! Ich persönlich benutze ein statisches Nachschlagewörterbuch, das nach Typ indiziert ist. Diese Funktion ist praktisch, wenn Sie mit serialisierten Objekten arbeiten, bei denen Sie nur die Typinformationen kennen.
HINWEIS: Dies kann fehlschlagen, wenn der Typ nicht konstruierbar ist oder keinen Standardkonstruktor hat!
die statischen Mitglieder, die Sie nur nie anschauen ... das ist genial. –
Private Mitglieder werden auch nicht angesehen.Angenommen, Sie brauchen nur öffentlich, dann scheint dies die einfachste zu sein. Aber ist es am schnellsten? Ich arbeite gerade an einem Test, um es herauszufinden. –
Nach einigen Messungen dieses Ansatzes gegenüber meinem Ansatz mit MeasureIt (http://msdn.microsoft.com/en-us/magazine/cc500596.aspx) ist dieser Ansatz in allen außer den einfachsten Fällen schneller und selbst dann ist es kaum langsamer. Das ist also sowohl das Einfachste als auch das Schnellste. Vielen Dank! –