Come determinare se ParameterInfo è di tipo generico?
-
12-10-2019 - |
Domanda
Ho un MethodInfo
di un GenericMethodDefinition. Come ad esempio: CallMethod<T>(T arg, string arg2)
. I GetParameters () metodo mi daranno due oggetti ParameterInfo, il primo dei quali è generica, la seconda delle quali non è. Come posso ottenere ParameterInfo a dirmi che è generico? Che dire se ha vincoli?
Soluzione
Controllare ParameterType.IsGenericParameter
.
Si consiglia inoltre di controllare ContainsGenericParameters
, che sarà vero per qualcosa come MyMethod<T>(List<T> param)
. (Anche se List<>
non è un parametro generico)
Se IsGenericParameter
è vero, si può anche chiamare GetGenericParameterConstraints()
per ottenere interfaccia o tipo di base vincoli, e si può controllare GenericParameterAttributes
(un [Flags]
enum) per new()
, struct
o vincoli class
.
Altri suggerimenti
Penso che si sta cercando questi:
parameterInfo.ParameterType.ContainsGenericParameters
parameterInfo.ParameterType.GetGenericParameterConstraints()
In aggiunta alla risposta degli altri alla seconda domanda: Sì possiamo ottenere i vincoli da ParameterInfo
utilizzando GetGenericParameterConstraints()
, ma non funziona per tutte le circostanze. Consideriamo alcuni metodo generico in questo modo:
public static void MyMethod<T,V>() where T : Dictionary<int, int>
{
}
C'è un vincolo per questo metodo, ma il metodo non avere parametri (pensare Enumerable.Cast ). Quello che sto per dire è il vincolo non è parte dei parametri, ma il metodo stesso. Siamo in grado di ottenere i vincoli da:
method.GetGenericArguments()[0].BaseType //the constraint of T
method.GetGenericArguments()[1].BaseType //that of V: Object
qui troverete circa riflettendo parametri generici ...