2012-04-06 22 views
14

Como disgussed en .NET Reflection set private property se puede establecer una propiedad con un setter privado. Pero cuando la propiedad se define en una clase base, se lanza System.ArgumentException: "Método de establecimiento de propiedad no encontrado".Método de conjunto de propiedades no encontrado en un tipo derivado

Un ejemplo puede ser:

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); 
    } 
} 

¿Alguien sabe una manera de hacer frente a esta situación?

Edit: El ejemplo dado es una simple ilustración del problema. En el escenario del mundo real, no sé si la propiedad se define en una clase base o se define en la base de la clase base.

Respuesta

20

Tuve un problema similar cuando mi propiedad privada fue declarada en una clase base. Usé DeclaringType para obtener un control sobre la clase donde se define la propiedad.

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

creo que esto va a funcionar:

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); 
    } 
} 

que necesita para obtener la definición de propiedad de la clase es en realidad define el no a la clase derivada

EDIT:

para recogerlo en cualquier clase base, tendrá que buscarla en todas las clases principales.

algo como esto, entonces es recursivo a la clase base hasta que golpeó objeto o encontrar su propiedad

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

Esto definitivamente funcionaría, si se conocía el tipo de base. Por favor mira mi edición. – tafa

7

Otra opción de un @ de LukeMcGregor es utilizar BaseType

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

Sí, si el árbol de herencia fue de longitud uno. Por favor mira mi edición. – tafa

+1

Luego camina por la línea ... Puede detenerse en System.Object. –

5

Hice este método reutilizable . Maneja mis escenarios.

private static void SetPropertyValue(object parent, string propertyName, object value) 
    { 
     var inherType = parent.GetType(); 
     while (inherType != null) 
     { 
      PropertyInfo propToSet = inherType.GetProperty(propertyName, BindingFlags.Public | BindingFlags.Instance); 
      if (propToSet != null && propToSet.CanWrite) 
      { 
       propToSet.SetValue(parent, value, null); 
       break; 
      } 

      inherType = inherType.BaseType; 
     } 
    } 
Cuestiones relacionadas