Voir RuntimeHelpers.GetUninitializedObject(Type)
Disponible à partir de .NET Core 2.0 / .NET Standard 2.1.
Une autre réponse suggère FormatterServices.GetUninitializedObject(Type)
qui se substitue directement aux RuntimeHelpers.
Pour être complet, si vous souhaitez créer un objet non initialisé du même type qu'une autre instance, dans .NET Core 7, il existe également une méthode non documentée, le AllocateUninitializedClone
avec l'exemple de code ci-dessous. Je ne recommanderais pas cette méthode plutôt que de simplement passer instance.GetType()
à l'API documentée.
De la même manière, voici des notes pour le cas où vous souhaiteriez réellement utiliser un constructeur interne :
Étant donné un Type
et quelques arguments.
Utilisation Activator.CreateInstance(Type type, object[] args)
) .
Alternativement via les API de réflexion
Utilisation type.GetConstructor
. Le retour ConstructorInfo
dispose d'un Invoke
méthode. Si vous passez une instance, vous réinitialiserez effectivement un objet. Si vous ne passez pas d'instance, l'invocation instanciera un nouvel objet.
Quelques exemples de code :
using System.Reflection;
using System.Runtime.CompilerServices;
public static class Program {
public static void Main() {
//
// create uninitialized object instance, then run ctor on it
//
var inst1 = (C)RuntimeHelpers.GetUninitializedObject(typeof(C));
Console.WriteLine(inst1.X); // 0
var ctor = typeof(C).GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Array.Empty<Type>());
ctor.Invoke(inst1, null); // Prints "Ran C's Ctor. X is -123"
Console.WriteLine(inst1.X); // 2
//
// create new object with ctor (via reflection)
//
var inst2 = (C)ctor.Invoke(null); // Prints "Ran C's Ctor. X is -123"
Console.WriteLine(inst2.X); // 2
//
// create new object with ctor (via activator)
//
var inst3 = (C)Activator.CreateInstance(typeof(C), BindingFlags.Instance | BindingFlags.NonPublic, null, null, null); // Prints "Ran C's Ctor. X is -123"
Console.WriteLine(inst3.X); // 2
//
// create new uninitialized object of type matching a given instance via undocumented AllocateUninitializedClone
//
var allocateUninitializedClone = typeof(RuntimeHelpers).GetMethod("AllocateUninitializedClone", BindingFlags.Static | BindingFlags.NonPublic, new[] { typeof(object) });
var inst4 = (C)allocateUninitializedClone.Invoke(null, new []{inst2});
Console.WriteLine(inst4.X); // 0
}
public class C {
private C() {
Console.WriteLine($"Ran C's Ctor. X is {X}");
X = 2;
}
public int X { get; } = -123;
}
}