Announcement

Collapse
No announcement yet.

Reflection: PropertyInfo.SetValue mit Index

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

  • Reflection: PropertyInfo.SetValue mit Index

    Hallo!
    Könnte bitte jemand darauf hinweisen, wie man in der Methode
    Code:
        PropertyInfo.SetValue(object oResult, object oValue, object[] index)
    die dritte Variable richtig setzt?

    Die bei Microsoft und anderswo zu findenden Erklärungen stimmen entweder nicht oder sind in allen Fällen unzureichend. Am besten wäre ein Beispiel.

    Dank im voraus!

    Stane

  • #2
    als 3.ter Parameter geht ein Object Array rein sollte eigentlich eindeutig sein.
    Wenn das bei dir nicht funktioniert könntest du uns nicht einfach am konkreten Beispiel zeigen was da nicht funktioniert? Ist einfacher.

    Code:
    new object[] { AufdenRichtigenTypGecasteterParameter1, AufDenRichtigenTypGecasteterParameter2, etc... }

    Comment


    • #3
      Beispiel

      Danke Ralf!
      Gerne, z.B.:
      Code:
      		class MyInnerClass
      		{
      			public string Name {get;set;}
      			public int Number {get;set;}
      		}
      
      		class MyOuterClass
      		{
      			public MyInnerClass[] Inner {get;set;}
      		}
      
                      static void Main()
      		{
      
      			MyInnerClass mic0 = new MyInnerClass{ Name="Test0", Number=9};
      			MyInnerClass mic1 = new MyInnerClass{ Name="Test1", Number=19};
      
      			MyOuterClass moc = new MyOuterClass();
      
                              /// Initialisiere den array in moc
      			moc.Inner	 = new MyInnerClass[2];
                              
                              /// Hole die property info 
      			PropertyInfo piInner = moc.GetType().GetProperty("Inner");
      			
                              /// Ein Versuch, dem 0-ten Element des initialisierten arrays etwas zuzuweisen;
                              /// scheitert mit TargetParameterCountException ("Parameter count mismatch.")
      			piInner.SetValue(moc, mic0, new object[]{(int)0});
      		}
      Wie oben im Code steht, geht das nicht: der letzte Operator in Main() wirft TargetParameterCountException ("Parameter count mismatch.")

      Wie wäre es richtig?
      Danke für jeden Tipp!

      Stane

      Comment


      • #4
        MyOuterClass.Inner ist keine Indexed Property sondern nur eine normale Property mit zufällig einem ArrayTypen. Darum die TargetParameterCountException. Keine indexed Property, keine Parameter erlaubt, nur null ist dann als 3.ter Parameter bei SetValue erlaubt.

        Dein Beispiel umgebaut auf eine Indexed Property sähe etwa so aus.

        [Highlight=C#]
        class MyInnerClass
        {
        public string Name { get; set; }
        public int Number { get; set; }
        }

        class MyOuterClass
        {
        private MyInnerClass[] inner = new MyInnerClass[2];

        public MyInnerClass this[int index]
        {
        get { return inner[index];}
        set { inner[index] = value; }
        }
        }

        static void Main()
        {
        MyInnerClass mic0 = new MyInnerClass { Name = "Test0", Number = 9 };
        MyOuterClass moc = new MyOuterClass();
        PropertyInfo piInner = moc.GetType().GetProperty("Item"); // der Indexer heißt intern immer Item siehe Doku!!

        piInner.SetValue(moc, mic0, new object[] { (int)0 });

        if (moc[0] == mic0)
        MessageBox.Show("MyInnerClass wurde zugewiesen.");
        }[/Highlight]

        Comment


        • #5
          Danke,
          das ist klar. Eine geregelte Möglichkeit, Werte mit Index zu setzen (so wie in meinem Beispiel), also für eine innere Variable, die ein Array ist, gibt es anscheinend nicht direkt. Den workaround mit mehrmals casten habe ich mir auch selber ermittelt und implementiert, das funktioniert.

          Trotzdem danke!
          Stane

          Comment


          • #6
            Eine geregelte Möglichkeit, Werte mit Index zu setzen (so wie in meinem Beispiel), also für eine innere Variable, die ein Array ist, gibt es anscheinend nicht direkt. Den workaround ...
            Nein. Wenn es ginge wieweit sollte man das auch treiben? Was ist wen du ein Objekt hast das eine Property hat das eine Property hat das einen Array ist?
            Das läßt sich ja beliebig tiefer schachteln. Bei SetValue kann man deswegen sinnvollerweise immer nur Object, Property, Wert (mit dem Sonderfall der Indexed Property) angeben.

            Das sag ich nur nochmal weil du den Begriff workaround verwendet hast. Nach dieser (deiner) Definition wäre ja jede Form von programmieren ein Workaround weil das System eine gewünschte Funktion noch nicht beherrscht und man es dummerweise selber machen muss

            Comment

            Working...
            X