Tome la siguiente clase como ejemplo:
class Sometype
{
int someValue;
public Sometype(int someValue)
{
this.someValue = someValue;
}
}
Luego quiero crear una instancia de este tipo usando la reflexión:
Type t = typeof(Sometype);
object o = Activator.CreateInstance(t);
Normalmente esto funcionará, sin embargo, debido a que SomeType
no se ha definido un constructor sin parámetros, la llamada a Activator.CreateInstance
arrojará una excepción de tipo MissingMethodException
con el mensaje " No se ha definido ningún constructor sin parámetros para este objeto " . ¿Existe alguna forma alternativa de crear una instancia de este tipo? Sería un poco asqueroso agregar constructores sin parámetros a todas mis clases.
FormatterServices.GetUninitializedObject
no permite crear una cadena no inicializada. Es posible que reciba una excepción:System.ArgumentException: Uninitialized Strings cannot be created.
tenga esto en cuenta.Respuestas:
Originalmente publiqué esta respuesta aquí , pero aquí hay una reimpresión ya que esta no es exactamente la misma pregunta pero tiene la misma respuesta:
FormatterServices.GetUninitializedObject()
creará una instancia sin llamar a un constructor. Encontré esta clase usando Reflector y explorando algunas de las clases principales de serialización de .Net.Lo probé usando el código de muestra a continuación y parece que funciona muy bien:
fuente
Utilice esta sobrecarga del método CreateInstance:
Ver: http://msdn.microsoft.com/en-us/library/wcxyzt4d.aspx
fuente
Cuando comparé el rendimiento
(T)FormatterServices.GetUninitializedObject(typeof(T))
, fue más lento. Al mismo tiempo, las expresiones compiladas le brindarían grandes mejoras de velocidad, aunque solo funcionan para tipos con constructor predeterminado. Adopté un enfoque híbrido:Esto significa que la expresión de creación se almacena en caché de manera efectiva y solo se penaliza la primera vez que se carga el tipo. Manejará los tipos de valor también de manera eficiente.
Llámalo:
Tenga en cuenta que
(T)FormatterServices.GetUninitializedObject(t)
fallará para la cadena. Por lo tanto, existe un manejo especial para la cadena para devolver una cadena vacía.fuente
Buenas respuestas pero inutilizables en el marco compacto de dot net. Aquí hay una solución que funcionará en CF.Net ...
fuente