Announcement

Collapse
No announcement yet.

C#: Kann man ein Object beim Funktionen übergabe direkt verwenden?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • C#: Kann man ein Object beim Funktionen übergabe direkt verwenden?

    Hallo zusammen

    Ich möchte wissen ob die unten stehendes C# Code irgend wie möglich währe ohne die Zeile TextBox tmpObject = (TextBox)myObject; schreiben zu müssen. Das ganze wäre im VB.Net nämlich möglich, aber im C# bekomme ich es nicht hin.

    #########################
    #C#.NET
    #########################
    private void Form1_Load(object sender, EventArgs e){
    TextBox myTextBox = new TextBox();
    myTextBox.Name = "myTextBox1";
    myTextBox.Text = "BLA BLA BLA BLA BLA BLA";

    MessageBox.Show(getName(myTextBox));
    }

    private String getName(object myObject){
    TextBox tmpObject = (TextBox)myObject; // <-- Ohne dieses Zeile? Sowie im VB.NET
    return tmpObject.Name;
    }


    #########################
    #VB.NET
    #########################
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim myTextBox As New TextBox
    myTextBox.Name = "myTextBox1"
    myTextBox.Text = "BLA BLA BLA BLA BLA BLA"

    MessageBox.Show(getName(myTextBox))
    End Sub

    Private Function getName(ByRef myObject As Object) As String
    Return myObject.Name
    End Function

    Besten Dank im voraus....

  • #2
    Hallo,

    Wenn du im VB.NET 'OPTION STRICT ON' setzt, wird die fragliche Zeile ebenfalls benoetigt werden.

    Wenn du die Zeile im C# wegkuerzen willst, koenntest du ua Code verwenden - aber ich wuesste nicht, warum dich diese Zeile stoert.

    Code:
    return ((TextBox)myObject).Name;
    *-- robert.oh. --*

    Comment


    • #3
      Danke für deinen Antwort,

      Ja die Zeile selbst stört mich nicht unbedingt, nur ist es so, dass ich verschiedene Objects dem Funktion getName(myTextBox oder myPictureBox etc.) übergeben möchte. Diese Objects haben Z.B alle den Properties Name, Width, Height etc. Nun möchte ich nicht zuerste den Type von Objects abfragen:

      private String getName(object myObject){
      if (myObject.GetType().ToString() == "System.Windows.Forms.TextBox")
      {
      TextBox tmpObject = (TextBox)myObject;
      return tmpObject.Name;
      }
      else if (myObject.GetType().ToString() == "System.Windows.Forms.PictureBox")
      {
      PictureBox tmpObject = (PictureBox)myObject;
      return tmpObject.Name;
      }

      return "false";
      }

      Comment


      • #4
        Hallo,
        Diese Objects haben Z.B alle den Properties Name, Width, Height etc.
        Wenn diese Objekte alle vom selben Typ abgeleitet sind, dann verwende doch diesen Typ. Bei den von Dir genannten Beispielen wäre es Control:
        Code:
        private String getName(Control myControl){
            return myControl.Name;
        }
        Dazu braucht man keine eigene getName-Methode, sondern kann das direkt abfragen:
        Code:
        object irgendwas = ...
        string name = irgendwas is Control ? (irgendwas as Control).Name : "Quatsch";
        Wenn die Objekte von verschiedenen Basistypen abstammen, muss die Abfrage getrennt werden; aber auch dann benutzt man den frühesten "Stammvater" (diesen Begriff habe ich jetzt dafür kreiert):
        Code:
        private String getName(object myObject){
            string result = "Quatsch";
            if (myObject is Control)
                result = (myObject as Control).Name;
            else if (myObject is Color)
                result = (myObject as Color).Name;
            return result;
        }
        Die Hierarchie der Klassen steht immer in der SDK-Doku auf der Seite "Informationen zur Xxx-Klasse".

        Jürgen

        Comment

        Working...
        X