Me gustaría comprobar si un tipo que se conoce en tiempo de ejecución proporciona un constructor sin parámetros. La clase Type
no dio nada prometedor, entonces supongo que tengo que usar la reflexión?¿Cómo puedo verificar si un tipo proporciona un constructor sin parámetros?
Respuesta
El Type
clase es la reflexión. Puede hacerlo:
Type theType = myobject.GetType(); // if you have an instance
// or
Type theType = typeof(MyObject); // if you know the type
var constructor = theType.GetConstructor(Type.EmptyTypes);
Devolverá nulo si no existe un constructor sin parámetros.
Si también quiere encontrar constructores privados, utilice el ligeramente más largo:
var constructor = theType.GetConstructor(
BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic,
null, Type.EmptyTypes, null);
Hay una advertencia para los tipos de valor, que aren't allowed to have a default constructor. Puede verificar si tiene un tipo de valor usando la propiedad Type.IsValueType
y crear instancias usando Activator.CreateInstance(Type)
;
esto no encontrará ctors fyi privados –
Esto tampoco funcionará para tipos de valores. – leppie
Comentarios dirigidos arriba. –
Sí, tiene que usar Reflection. Pero que ya hace que cuando se utiliza GetType()
Algo así como:
var t = x.GetType();
var c = t.GetConstructor(new Type[0]);
if (c != null) ...
Esto debería funcionar:
myClass.GetType().GetConstructors()
.All(c=>c.GetParameters().Length == 0)
No es lo que quise decir, pero no lo elimine, es un problema relacionado y una buena información. – mafu
Sí, tienes que usar la reflexión.
object myObject = new MyType();
Type type = myObject.GetType();
ConstructorInfo conInfo = type.GetConstructor(new Type[0]);
Dependiendo de su situación, también se puede utilizar una restricción de tipo genérico:
public void DoSomethingWith<T>(T myObject) where T:new() {...}
La declaración método anterior restringirá el tipo de parámetro a cualquier objeto que puede ser instanciada con un constructor sin parámetros. La ventaja aquí es que el compilador detectará cualquier intento de usar el método con una clase que no tenga un constructor sin parámetros, por lo que siempre que el tipo se conozca EN ALGÚN LUGAR en tiempo de compilación, esto funcionará y lo alertará sobre un problema antes.
Por supuesto, si el tipo realmente se conoce solo en tiempo de ejecución (es decir, si está utilizando Activator.CreateInstance() para instanciar un objeto basado en una cadena o un Type construido), entonces esto no lo ayudará. Generalmente uso el reflejo como la última opción absoluta, porque una vez que has ido a la tierra dinámica, tienes que mantenerte en una tierra dinámica; por lo general es difícil o incluso más complicado crear una instancia dinámica de algo y luego comenzar a tratarlo estáticamente.
En realidad, hay un patrón muy útil para unir los terrenos de invocación estática y dinámica: una clase de almacenamiento en caché genérico estático [p. 'EqualityComparer.Default
fallarán en struct
s. Mejor para extenderla:
public static bool HasDefaultConstructor(this Type t)
{
return t.IsValueType || t.GetConstructor(Type.EmptyTypes) != null;
}
tiene éxito ya que incluso tienen enum
s constructor sin parámetros por defecto. También se acelera ligeramente para tipos de valores ya que no se realiza la llamada de reflexión.
Necesitaba contar constructores con solo parámetros opcionales iguales a los verdaderos constructores sin parámetros.Para ello:
myClass.GetType().GetConstructors()
.All(c => c.GetParameters().Length == 0 || c.GetParameters().All(p => p.IsOptional))
- 1. ¿cómo puedo verificar si existe un archivo?
- 2. ¿Cómo verificar si un tipo sobrecarga/admite un determinado operador?
- 3. KeyValuePair: ¿ningún constructor sin parámetros?
- 4. ¿Cómo puedo verificar si existe un directorio?
- 5. Constructor de Scala sin parámetros
- 6. ¿Cómo se proporciona un tipo predeterminado para genéricos?
- 7. ¿Cómo verificar si un objeto es convertible a otro tipo?
- 8. ¿Cómo verificar si un parámetro de tipo genérico es anulable?
- 9. ¿Cómo puedo verificar si un JSON está vacío en NodeJS?
- 10. ¿Cómo puedo verificar si existe un procedimiento en un paquete?
- 11. ¿Cómo puedo verificar si un valor es un número?
- 12. ¿Cómo verificar si existe un documento de couchdb (sin recuperarlo)?
- 13. ¿Cómo pasar parámetros a un constructor?
- 14. Cómo verificar si un DataGridViewCheckBoxCell está marcado
- 15. ¿Cómo puedo verificar si un identificador de MATLAB es válido?
- 16. ¿Cómo puedo verificar si todavía hay un socket abierto?
- 17. llamar al constructor de un tipo genérico
- 18. ¿Cómo puedo verificar si existe un archivo usando Emacs Lisp?
- 19. ¿Cómo puedo verificar si existe o no un recurso incrustado?
- 20. ¿Cómo puedo verificar si existe un nombre de usuario dado?
- 21. ¿Cómo puedo verificar si actualmente se está visualizando un UIViewController?
- 22. ¿Cómo puedo verificar si se lanza un objeto?
- 23. ¿Cómo puedo verificar si un entero con signo es positivo?
- 24. ¿Cómo puedo verificar si existe un buffer actual en Emacs?
- 25. ¿Cómo puedo verificar si un complemento jQuery está cargado?
- 26. ¿Cómo puedo verificar si un filehandle está abierto en Perl?
- 27. ¿Cómo puedo verificar si un atributo existe en XmlAttributeCollection?
- 28. java: ArrayList: ¿cómo puedo verificar si existe un índice?
- 29. ¿Cómo puedo verificar si un puntero apunta a NULL?
- 30. ¿Cómo puedo verificar si un gráfico dirigido es acíclico?
Creo que es justo – kenny
Nota al margen: Existe una limitación genérica para los constructores sin parámetros. – CodesInChaos
es la pregunta si el tipo ** solo ** proporciona un constructor sin parámetros o si proporciona uno en absoluto? – BrokenGlass