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?

È stato utile?

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 ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top