Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   C# Herkunft von Methoden/Properties ermitteln (https://www.delphipraxis.net/53143-herkunft-von-methoden-properties-ermitteln.html)

MathiasSimmack 11. Sep 2005 09:56


Herkunft von Methoden/Properties ermitteln
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo. :stupid: Ihr wisst ja, dass ich nebenbei immer noch ein bisschen an der Hilfe von SharpDevelop schraube. Zurzeit ist das die dynamische Hilfe von SharpDevelop 2.0.
Wenn man im Form-Designer von #d ein Objekt anklickt, etwa eine TextBox, dann sucht sich die dynamische Hilfe die passenden Themen dazu heraus. Zusätzlich bietet sich auch eine Hilfe zu dem im Objektinspektor aktiven Punkt an. Im Beispiel (s. Bild im Anhang) wäre das etwa die Text-Eigenschaft.
Dazu hänge ich einfach an den ermittelten Namen der Klasse (System.Windows.Forms.TextBox) den Namen der Methode an (*.Text). Einige Klassen erben aber solche Sachen von ihren übergeordneten Klassen. Und deshalb gibt es bspw. beim Button kein Thema zu System.Windows.Forms.Button.Text, sondern da müsste ich auf *.ButtonBase.Text ausweichen.

Tja, wie mache ich das am elegantesten? Momentan "schleife" ich mich durch die Klasse durch, bis ich bei der Top-Klasse angelangt bin und übergebe alle so ermittelten Suchbegriffe an die Hilfe. Ich weiß ja zu diesem Zeitpunkt noch nicht, wann die Hilfe fündig werden wird, also kann ich leider auch nicht vorher aufhören:
Code:
Type myObject = selectedObject.GetType();
if(selectedItem != null)
{
  this.AddToStringCollection(String.Format("!{0}.{1}", myObject.FullName, selectedItem.Label));

  while(myObject.BaseType != null)
  {
    myObject = myObject.BaseType;
    this.AddToStringCollection(String.Format("!{0}.{1}", myObject.FullName, selectedItem.Label));
  }
}
"selectedObject" und "selectedItem" kommen quasi aus dem PropertyGrid von SharpDevelop. Das Ausrufungszeichen setze ich absichtlich davor, damit die Hilfefunktion später weiß, dass sie die Anzeige weiterer Themen mit ! am Anfang unterdrücken soll, wenn bereits zum ersten Begriff in der Liste was gefunden wurde.

Da muss es doch was Einfacheres/Eleganteres geben. :gruebel:

Robert_G 11. Sep 2005 11:27

Re: Herkunft von Methoden/Properties ermitteln
 
Du bist aber auch ungeduldig...

Da ich nicht weiß, ob du notfalls auch überladene/reintroduced Meber haben willst, habe ich es in einen Iterator gepackt.
Er läuft durch die gefundenen Member und gibt dir den Typen, in dem er deklariert/überschrieben wurde.

Code:
public static class TypeHandling
{
   public static IEnumerable<Type> FindDeclaringType(Type type, string memberName)
   {
      MemberInfo[] memberInfos = type.GetMember(memberName);


      foreach (MemberInfo memberInfo in memberInfos)
      {
         yield return memberInfo.DeclaringType;
      }
   }
}
Oder um es mit einem Hauch von Syntax Highlighting zu zeigen:
Delphi-Quellcode:
uses
   System.Collections.Generic,
   System.Reflection;

type
  TypeHandling = public static class
  public
      class method FindDeclaringType(&type : System.Type; memberName : String) : IEnumerable<System.Type>; iterator;
  end;
 
implementation

class method TypeHandling.FindDeclaringType(&type : System.Type; memberName : String) : IEnumerable<System.Type>;
begin
      var memberInfos := &type.GetMember(memberName);

      for memberInfo : MemberInfo in memberInfos do
         yield (memberInfo.DeclaringType);
end;

Kleines Beispiel:
Code:
TextBox myObject = new TextBox();

foreach (Type type in TypeHandling.FindDeclaringType(myObject.GetType(),
                                                     "Name"))
{
   Console.WriteLine(type.Name);
}

foreach (Type type in TypeHandling.FindDeclaringType(myObject.GetType(),
                                                     "Text"))
{
   Console.WriteLine(type.Name);
}

Console.ReadLine();
Output
Control
TextBox

MathiasSimmack 11. Sep 2005 13:51

Re: Herkunft von Methoden/Properties ermitteln
 
Na, das kommt doch heute noch in das Repository. Am besten mit dem Originalzitat aus der PM :mrgreen:.
Herzlichen Dank.


Zitat:

Du bist aber auch ungeduldig...
Ja. Schließlich ist Zeit dein Geld. :stupid:

Sharky 11. Sep 2005 17:28

Re: Herkunft von Methoden/Properties ermitteln
 
Auf Wunsch von Mathias habe ich den Thread aufgeteilt.

Hier ist der folge Thread.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:59 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz