2012-04-06 5 views
14

Wie in .NET Reflection set private property beschrieben, kann man eine Property mit einem privaten Setter setzen. Wenn die Eigenschaft jedoch in einer Basisklasse definiert ist, wird System.ArgumentException ausgelöst: "Property-Set-Methode nicht gefunden".Die Eigenschaft Set-Methode wurde nicht in einem abgeleiteten Typ gefunden.

kann ein Beispiel sein:

using System; 
class Test 
{ 
    public DateTime ModifiedOn { get; private set;} 
} 

class Derived : Test 
{ 
} 

static class Program 
{ 
    static void Main() 
    { 
     Derived p = new Derived(); 
     typeof(Derived).GetProperty("ModifiedOn").SetValue(
      p, DateTime.Today, null); 
     Console.WriteLine(p.ModifiedOn); 
    } 
} 

Kennt jemand eine Möglichkeit, diese Situation zu bewältigen?

Bearbeiten: Das angegebene Beispiel ist eine einfache Illustration des Problems. Im Real-World-Szenario weiß ich nicht, ob die Eigenschaft in einer Basisklasse definiert oder in der Basis der Basisklasse definiert ist.

Antwort

20

Ich hatte ein ähnliches Problem, bei dem meine private Eigenschaft in einer Basisklasse deklariert wurde. Ich habe DecellingType verwendet, um ein Handle für die Klasse zu erhalten, in der die Eigenschaft definiert ist.

using System; 
class Test 
{ 
    public DateTime ModifiedOn { get; private set;} 
} 

class Derived : Test 
{ 
} 

static class Program 
{ 
    static void Main() 
    { 
     Derived p = new Derived(); 

     PropertyInfo property = p.GetType().GetProperty("ModifiedOn"); 
     PropertyInfo goodProperty = property.DeclaringType.GetProperty("ModifiedOn"); 

     goodProperty.SetValue(p, DateTime.Today, null); 

     Console.WriteLine(p.ModifiedOn); 
    } 
} 
9

Ich denke, das funktioniert: tatsächlich definiert auf nicht der abgeleiteten Klasse

EDIT

using System; 
class Test 
{ 
    public DateTime ModifiedOn { get; private set;} 
} 

class Derived : Test 
{ 
} 

static class Program 
{ 
    static void Main() 
    { 
     Derived p = new Derived(); 
     typeof(Test).GetProperty("ModifiedOn").SetValue(
      p, DateTime.Today, null); 
     Console.WriteLine(p.ModifiedOn); 
    } 
} 

Sie müssen ihre die Eigenschaftsdefinition aus der Klasse erhalten:

es holen Auf jeder Basisklasse müssen Sie in allen Elternklassen danach suchen.

so etwas wie dieses dann auf die Basisklasse Rekursion, bis du Objekt getroffen oder finden Sie Ihr Eigentum

typeof(Derived).GetProperties().Contains(p=>p.Name == "whatever") 
+0

Dies würde definitiv funktionieren, wenn der Basistyp bekannt wäre. Bitte sehen Sie meine Bearbeitung. – tafa

7

Eine andere Option als @ one LukeMcGregor der ist Basetype verwenden

typeof(Derived) 
    .BaseType.GetProperty("ModifiedOn") 
    .SetValue(p, DateTime.Today, null); 
+0

Ja, wenn der Vererbungsbaum von der Länge eins war. Bitte sehen Sie meine Bearbeitung. – tafa

+1

Dann gehen Sie die Linie ... Sie können bei System.Object stoppen. –

5

habe ich diese wiederverwendbare Methode . Es behandelt meine Szenarien.

Verwandte Themen