22 Stimmen

Ableitung des Typs einer abgeleiteten Klasse aus der statischen Methode einer Basisklasse

Ich möchte den Typ der abgeleiteten Klasse aus einer statischen Methode ihrer Basisklasse abrufen.

Wie lässt sich dies bewerkstelligen?

Danke!

class BaseClass {
  static void Ping () {
     Type t = this.GetType(); // should be DerivedClass, but it is not possible with a static method
  }
}
class DerivedClass : BaseClass {}

// somewhere in the code
DerivedClass.Ping();

0voto

Jürgen Steinblock Punkte 28819

Nur eine Vermutung (nicht getestet)

Type t = MethodBase.GetCurrentMethod().DeclaringType;

0voto

FlyingStreudel Punkte 4324

Warum nicht einfach die bereits vorhandenen Methoden anwenden?

Wenn Sie eine

class BaseClass {}
partial class DerivedClass : BaseClass {}

Sie können sich ansehen

DerivedClass.GetType().BaseType;

0voto

Χpẘ Punkte 3243

Ich denke, dass das Folgende für diesen Fall (und mehrere ähnliche Fälle in SO) funktionieren wird. Perf wird nicht allzu gut sein, aber wenn dies selten vorkommt, wird das kein Problem sein.

Erstellen Sie einen Stacktrace und analysieren Sie ihn auf der Suche nach einer abgeleiteten Klasse. Im allgemeinen Fall wäre dies nicht sehr zuverlässig oder könnte sogar nicht funktionieren, aber in bestimmten Fällen Ich glaube, das wird gut funktionieren. In Powershell:

$strace = (new-object diagnostics.stacktrace).tostring()
#
$frames = $strace -split "   at "
$typesFromFrames = $frames | select -skip 1| # skip blank line at the beginning
   % { ($_ -split "\(",2)[0]} |                 # Get rid of parameters string
   % {$_.substring(0,$_.lastindexof("."))} |    # Get rid of method name
   $ {$_ -as [type]}
#
# In powershell a lot of the frames on the stack have private classes
#  So $typesFromFrames.count is quite a bit smaller than $frames.count
#  For the OP, I don't think this will be a problem because:
#   1. PS isn't being used
#   2. The derived class in the OP isn't private 
#        (if it is then tweaks will be needed)
#
$derivedOnStack = $typesFromFrames | ? { $_.issubclassof( [BaseClass])}

Hoffentlich wird es nur ein Element in $derivedOnStack geben, aber das hängt von den Besonderheiten der Anwendung ab. Einige Experimente werden erforderlich sein.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X