2016-06-08 2 views
2

Vor Dotnet Kern konnten wirWie kann ich eine geschützte Methode über Reflection-Matching-Name und Parametertyp erhalten?

var member = type.GetMethod(name, bindingFlags, null, argtypes, null); 

Um Zugriff auf ein Verfahren tun, seinen Namen und Parameter Typ übereinstimmt, in Dotnet Kern sie diese Überlastung entfernt, jetzt kann ich von name && binding flags bekommen nur OR name && parameters type (see) aber nicht wie vorher.

Es gibt eine neue Methode GetRuntimeMethods, die IEnumerable<MethodInfo> zurückgibt und nicht öffentliche Methoden enthält, aber ich kann nicht nach Parametertyp filtern.

Es gibt eine andere Methode GetRuntimeMethod, die ich nach Parametertyp filtern kann, aber es enthält nicht öffentliche Methoden.

Ich habe bereits versucht, so etwas, aber nicht

var member = type.GetRuntimeMethods().Where(m => 
m.Name == name && (m.GetParameters().Select(p => p.GetType()).ToArray() == argtypes)).FirstOrDefault(); 

Gibt es eine Möglichkeit, ein Verfahren durch ihren Namen und Parameter Typen zu bekommen?

+1

Ich glaube nicht, Sie Arrays wie das vergleichen kann. 'M.GetParameters() Wählen Sie (p => p.GetType()). ToArray() == argtypes) '- es vergleicht nicht Array-Elemente, sondern Array-Referenzen, so dass es immer falsch ist. Sie können 'Zip' oder' SequenceEqual' verwenden, um den Inhalt von Arrays zu vergleichen. – Pawel

Antwort

2

Ja, diese Überlastung fehlt tatsächlich. Was Sie verwenden können, ist GetMethods() zu verwenden und die Ausgabe so zu filtern, wie Sie es möchten. Ihr Versuch ist in der Nähe, außer dass Sie nicht Arrays == mit vergleichen kann:

var method = type.GetMethods().FirstOrDefault(m => 
    m.Name == name && m.GetParameters().Select(p => p.ParameterType).SequenceEqual(argTypes)); 
+0

Mein schlechtes! Funktioniert wie ein Zauber, ich musste nur p.GetType() zu p.ParameterType ändern. Tks – ferodss