Wie Sie feststellen, ob Parameterinfo generischer Typ ist?
-
12-10-2019 - |
Frage
habe ich eine MethodInfo
eines GenericMethodDefinition. Wie zum Beispiel: CallMethod<T>(T arg, string arg2)
. Die GetParameters () Methode gibt mir zwei Parameterinfo-Objekte, von denen die ersten generisch ist, ist die zweite, von denen nicht. Wie kann ich mich Parameterinfo zu sagen, es ist generisch? Was ist, wenn es hat Einschränkungen?
Lösung
Überprüfen Sie ParameterType.IsGenericParameter
.
Sie können auch prüfen ContainsGenericParameters
wollen, die für so etwas wie MyMethod<T>(List<T> param)
wahr sein wird. (Auch wenn List<>
ist nicht ein allgemeiner Parameter)
Wenn IsGenericParameter
wahr ist, können Sie auch GetGenericParameterConstraints()
rufen Schnittstelle oder Basistyp Einschränkungen zu erhalten, und Sie können GenericParameterAttributes
überprüfen (a [Flags]
Enumeration) für new()
, struct
oder class
Einschränkungen.
Andere Tipps
Ich glaube, Sie für diese suchen:
parameterInfo.ParameterType.ContainsGenericParameters
parameterInfo.ParameterType.GetGenericParameterConstraints()
Zusätzlich zu anderen Antwort auf die zweite Frage: Ja, wir können die Einschränkungen von ParameterInfo
mit GetGenericParameterConstraints()
bekommen, aber es funktioniert nicht für alle Umstände. Betrachten wir einige generische Methode wie folgt:
public static void MyMethod<T,V>() where T : Dictionary<int, int>
{
}
Es gibt eine Einschränkung für diese Methode, aber das Verfahren nicht über Parameter (man denke etwa Enumerable.Cast ). Was werde ich sagen, ist die Einschränkung nicht Teil der Parameter ist, aber die Methode selbst. Wir können die Einschränkungen erhalten durch:
method.GetGenericArguments()[0].BaseType //the constraint of T
method.GetGenericArguments()[1].BaseType //that of V: Object
Vielleicht hier Sie finden Informationen über reflektierende allgemeine Parameter ...