Vorrei verificare se un tipo noto in fase di esecuzione fornisce un costruttore senza parametri. La classe Type
non ha dato risultati promettenti, quindi presumo di dover utilizzare la riflessione?Come posso verificare se un tipo fornisce un costruttore senza parametri?
risposta
Il Type
classe è riflessione. Si può fare:
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);
Restituirà null se non esiste un costruttore senza parametri.
Se anche voi volete trovare costruttori privati, utilizzare il leggermente più lungo:
var constructor = theType.GetConstructor(
BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic,
null, Type.EmptyTypes, null);
C'è un avvertimento per i tipi di valore, che aren't allowed to have a default constructor. È possibile verificare se si dispone di un tipo di valore utilizzando la proprietà Type.IsValueType
e creare istanze utilizzando Activator.CreateInstance(Type)
;
questo non troverà cori privati fyi –
Questo non funzionerà anche per i tipi di valore. – leppie
Commenti indirizzati sopra. –
Sì, è necessario utilizzare Reflection. Ma fai già che quando si utilizza GetType()
Qualcosa di simile:
var t = x.GetType();
var c = t.GetConstructor(new Type[0]);
if (c != null) ...
Questo dovrebbe funzionare:
myClass.GetType().GetConstructors()
.All(c=>c.GetParameters().Length == 0)
Non è quello che intendevo, ma per favore non cancellarlo - è un problema correlato e una bella informazione. – mafu
Sì, è necessario utilizzare la riflessione.
object myObject = new MyType();
Type type = myObject.GetType();
ConstructorInfo conInfo = type.GetConstructor(new Type[0]);
A seconda della situazione, si potrebbe anche usare una restrizione tipo generico:
public void DoSomethingWith<T>(T myObject) where T:new() {...}
La dichiarazione di metodo di cui sopra sarà limitare il tipo di parametro a qualsiasi oggetto che può essere istanziato con un costruttore senza parametri. Il vantaggio qui è che il compilatore prenderà qualsiasi tentativo di usare il metodo con una classe che non ha un costruttore senza parametri, quindi finché il tipo è conosciuto SOMEWHERE in fase di compilazione, funzionerà e ti avviserà di un problema in precedenza.
Ovviamente se il tipo è noto solo in fase di esecuzione (ad esempio, si sta utilizzando Activator.CreateInstance() per creare un'istanza di un oggetto in base a una stringa o un tipo costruito), questo non sarà di aiuto. Generalmente uso la riflessione come ultima opzione assoluta, perché una volta che sei passato alla terra dinamica devi praticamente rimanere in una terra dinamica; di solito è difficile o anche più disordinato creare un'istanza dinamicamente e poi iniziare a gestirlo staticamente.
In realtà, esiste un modello molto utile per eseguire il bridging delle terre di invocazione statica e dinamica: una classe di caching generica statica [ad es. 'EqualityComparer.Default
type.GetConstructor(Type.EmptyTypes) != null
non riuscirebbe per struct
s. Meglio di estenderlo:
public static bool HasDefaultConstructor(this Type t)
{
return t.IsValueType || t.GetConstructor(Type.EmptyTypes) != null;
}
riesce dal momento che anche enum
s hanno costruttore senza parametri di default. Accelera leggermente anche per i tipi di valore poiché la chiamata di riflessione non viene eseguita.
Avevo bisogno di contare i costruttori con solo i parametri opzionali come i veri costruttori senza parametri.Per fare ciò:
myClass.GetType().GetConstructors()
.All(c => c.GetParameters().Length == 0 || c.GetParameters().All(p => p.IsOptional))
- 1. Come verificare un tipo per il costruttore senza parametri?
- 2. Posso costruire un costruttore senza parametri per un tipo parametrico in un costruttore esterno?
- 3. Verificare se un costruttore chiama un altro costruttore
- 4. Come verificare se un tipo è un typedef di int
- 5. Come posso verificare se un tipo è un sottotipo di un tipo in Python?
- 6. come posso verificare se esiste un file?
- 7. Come posso determinare il tipo senza parametri di un tipo generico C# a scopo di controllo?
- 8. C# serializza una classe senza un costruttore senza parametri
- 9. Come verificare se un tipo sovraccarica/supporta un determinato operatore?
- 10. Verificare se un determinato tipo è un delegato di azione
- 11. Come posso verificare se un elenco contiene un oggetto di un certo tipo? C#
- 12. C++ verificare se il costruttore contiene un parametro di determinato tipo
- 13. Verificare se un tipo è un'interfaccia
- 14. Selezione costruttore senza parametri Autofac
- 15. Impossibile istanziare il proxy ... Impossibile trovare un costruttore senza parametri
- 16. Come si fornisce un tipo predefinito per generici?
- 17. C++ 11: Come verificare se un tipo è un'istanza di un dato modello di classe di parametri "eterogenei" NON TIPO?
- 18. Come posso verificare se un valore è un numero?
- 19. Come posso verificare se una variabile contiene un lambda?
- 20. Come verificare se un tipo è una stringa in C#?
- 21. Come verificare se un tipo è astratto in .NET Core?
- 22. Come posso usare linq per verificare se un flag/enumerazione bitwise contiene un tipo?
- 23. Come posso verificare se un parametro del metodo generico è un tipo di valore?
- 24. Mock un costruttore con parametri
- 25. Perché Java non fornisce il costruttore predefinito, se la classe ha un costruttore parametrizzato?
- 26. Chiamando il costruttore di un tipo generico
- 27. Come posso verificare se sono in un contesto controllato?
- 28. Come posso verificare se esiste un vincolo di SQL Server?
- 29. Deve essere un tipo non astratto con costruttore pubblico senza parametri
- 30. Come posso verificare se un socket è ancora aperto?
Penso che sia giusto – kenny
Sidenote: C'è un vincolo generico per i costruttori senza parametri. – CodesInChaos
è la domanda se il tipo ** solo ** fornisce un costruttore senza parametri o se ne fornisce uno a tutti? – BrokenGlass