Perché voglio evitare un'eccezione, voglio verificare se un tipo ha un costruttore senza parametri. Come posso raggiungere questo obiettivo?Come verificare un tipo per il costruttore senza parametri?
ho bisogno di qualcosa di simile:
bool HasDefaultConstructor<TT>(TT source)
{
return ???;
}
EDIT: Voglio creare un oggetto dello stesso tipo, come fonte e se non ha un costruttore di default che voglio usare di default (TT), invece.
Quello che ho in questo momento è:
static TT CreateObject<TT>(TT source)
{
try
{
if(!HasDefaultConstructor<TT>(source))
{
return default(TT);
}
return (TT)Activator.CreateInstance(source.GetType());
}
catch(Exception ex)
{
Trace.WriteLine("Exception catched!\r\n" + ex);
}
return default(TT);
}
static bool HasDefaultConstructor<TT>(TT source)
{
ConstructorInfo c = typeof(TT).GetConstructor(new Type[] { });
return c != null;
}
Ma l'assegno mi dà la vera e CreateInstance getta eccezione
Nessun costruttore senza parametri
Soluzione:
bool HasDefaultConstructor(Type t)
{
return t.GetConstructor(Type.EmptyTypes) != null;
}
C'erano molte funzioni ricorsive e le iterazioni coinvolte e da qualche parte in questo modo, è stata chiamata la funzione generica errata HasDefaultConstructor (con tipo oggetto). Usare una funzione non generica ha fatto il trucco.
Grazie a tutti per il vostro aiuto costruttivo.
Si prega di chiarire la tua domanda - come si vuole invocare il costruttore? Come ci si aspetta un'eccezione se non esiste un costruttore senza parametri, lo prendo vuoi che il codice sia ancora compilabile anche se il tipo indicato per 'TT' non ha un costruttore simile? –
Se non esiste un costruttore predefinito, desidero utilizzare il valore predefinito (TT). – MTR
Aha! Quindi, per favore, includi queste informazioni nella tua domanda.Cambia significativamente il significato della domanda e rende non valide le risposte che si riferiscono al vincolo generico 'new()' non valido. –