As disgussed in .NET Reflection set private property one can set a property with a private setter. But when the property is defined in a base class, System.ArgumentException is thrown : "Property set method not found".
An example can be:
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);
}
}
Does anyone know a way to tackle this situation?
Edit: The example given is a simple illustration of the problem. In the real world scenario, I do not know if the property is defined in a base class, or defined in the base of the base class.
I had a similar problem where my private property was declared in a base class. I used DeclaringType to get a handle on the class where the property is defined.
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);
}
}
I think this will work:
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);
}
}
You need to get the property definition from the class its actually defined on not the derived class
EDIT:
To pick it on any base class you will need to look for it on all of the parent classes.
something like this then recurse to the base class till you hit object or find your property
typeof(Derived ).GetProperties().Contains(p=>p.Name == "whatever")
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With