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-Key: 420806

Url: https://administrator.de/contentid/420806

Printed on: April 25, 2024 at 20:04 o'clock

Member: mayho33
Solution mayho33 Feb 24, 2019 at 15:09:40 (UTC)
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
Member: emeriks
emeriks Feb 25, 2019 at 07:24:49 (UTC)
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
Member: mayho33
mayho33 Feb 25, 2019 at 09:36:40 (UTC)
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