emeriks
Goto Top

VB.Net - In Sub eine abgeleitet Klasse ermitteln

Hi,

--> VB.Net

ich habe viele eigene abgeleitete Klassen, z.T. auch mehrfach abgeleitet
Bsp.:
mask1 --> abgeleitet von UserControl
mask2 --> abgeleitet von mask1
mask3 --> abgeleitet von mask1

box1 --> abgeleitet von Textbox
box2 --> abgeleitet von box1
box3 --> abgeleitet von box1

Das sind nur Beispiele! Viele verschiedene Control-Typen.

Ich habe Instanzen von diesen Klassen
M2 --> Instanz von mask2
M3 --> Instanz von mask3

T2 --> Instanz von box2
T3 --> Instanz von box3

Diese Controls können nun ineinander verschachtelt sein. (Child Controls)
z.B.
M2 und M3 können Child Controls enthalten. So auch z.B. vom Typ T2 oder T3.

Ich will nun eine Sub schreiben:
"Finde für diese Instanz eines Controls vom beliebigen Typ X das erste übergeordnete Control vom beliebigen Typ Y"

Normalerweise kann ich ja fragen
If TypeOf Control1.Parent Is Typ1
Bsp.
TypeOf M2 Is mask2 --> True
TypeOf M2 Is UserControl --> True

Wenn ich jetzt eine Funktion schreibe wie z.B.
  Public Function FindParentControlOfType(ByVal Value As Control, ByVal ControlType As Type) As Control
    Dim µReturnValue As Control = Value 

    While µReturnValue IsNot Nothing AndAlso _
          Not µReturnValue.GetType = ControlType
      µReturnValue = µReturnValue .Parent
    End While

    Return µReturnValue 
  End Function
dann funktioniert das nicht mit mehrfach abgeleiteten Klassen, weil GetType jene Klasse liefert, aus welcher das Objekt direkt instantiiert ist, und nicht deren Eltern-Klassen.

Also der Plan, in der Funktion mit TypeOf abzufragen, weil dieses auf dann True liefert, wenn man nach einer Eltern-Klasse fragt.

Der Haken: Ich weiß nicht, wie ich jetzt meiner Funktion den zweiten Parameter ControlType übergeben muss, damit ich diesen in der Funktion mit TypeOf verwenden kann:
    While µReturnValue IsNot Nothing AndAlso _
          Not TypeOf µReturnValue Is ControlType
      µReturnValue = µReturnValue .Parent
    End While


Könnt Ihr mir folgen?

E.

Content-ID: 420806

Url: https://administrator.de/forum/vb-net-in-sub-eine-abgeleitet-klasse-ermitteln-420806.html

Ausgedruckt am: 02.04.2025 um 03:04 Uhr

mayho33
Lösung mayho33 24.02.2019 um 16:09:40 Uhr
Goto Top
Hi emerics,

ist zwar in c#, aber eventuell hifreich:

https://stackoverflow.com/questions/2742276/how-do-i-check-if-a-type-is- ...

Mayho
emeriks
emeriks 25.02.2019 um 08:24:49 Uhr
Goto Top
Zitat von @mayho33:
Hi emerics,
Wer ist das? face-wink

Ja, danke, IsSubclassOf hilft weiter. s.u. Code

Ich weiß zwar jetzt immer noch nicht, wie man den Parameter ControlType übergeben müsste, damit man diesen mit TypeOf verwenden kann, aber mein ursächliches Anliegen wäre erstmal erledigt.


  Public Function FindParentControlOfType(ByVal Value As Control, ByVal ControlType As Type) As Control
    Dim µReturnValue As Control = Value.Parent

    While µReturnValue IsNot Nothing AndAlso _
          Not µReturnValue.GetType = ControlType AndAlso _
          Not µReturnValue.GetType.IsSubclassOf(ControlType)
      µReturnValue = µReturnValue.Parent
    End While

    Return µReturnValue
  End Function
mayho33
mayho33 25.02.2019 um 10:36:40 Uhr
Goto Top
Zitat von @emeriks:

Zitat von @mayho33:
Hi emerics,
Wer ist das? face-wink


Ohhhh LOL !!

So spät wars doch noch gar nicht (??) face-big-smile

hier mal ein Codesnipped von dem aks ich damals etwas ähnliches gesucht habe. Halt leider wieder in C#:
public static T GetPropertyValue<T>(string controlName)
//default return Value for geneneric methode: https://stackoverflow.com/questions/302096/how-can-i-return-null-from-a-generic-method-in-c
//example for generic methode: https://stackoverflow.com/questions/9808035/how-do-i-make-the-return-type-of-a-method-generic
 //call example: GetPropertyValue<Visibility>("UiVisibility", "UserControlA"); 
{
    var toreturn = default(T);
    var newAssemblyInstance = Assembly.Load(Assembly.GetExecutingAssembly().GetName().Name);

    foreach (var uiElement in newAssemblyInstance.GetTypes().Where(s => s.BaseType == typeof(System.Windows.Controls.UserControl)))
    {
        if (uiElement.Name.ToUpper() == controlName.ToUpper())
        { }
    }

    return toreturn;
}

Du holst dir also alle Classes und Controls direkt aus dem Assembly in der Methode via Reflection und übergibst nur den Namen des gesuchten Controls als string

Hoffe das hilft dir weiter!

Mayho