Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

.NET Reflection set private property

Tags:

If you have a property defined like this:

private DateTime modifiedOn; public DateTime ModifiedOn {     get { return modifiedOn; } } 

How do you set it to a certain value with Reflection?

I've tried both:

dto.GetType().GetProperty("ModifiedOn").SetValue(dto, modifiedOn, null); 

and

dto.GetType().GetProperty("modifiedOn").SetValue(dto, modifiedOn, null); 

but without any success. Sorry if this is a stupid question but it's the first time I'm using Reflection with C#.NET.

like image 985
Lieven Cardoen Avatar asked Nov 22 '09 10:11

Lieven Cardoen


1 Answers

That has no setter; you'd need:

public DateTime ModifiedOn {     get { return modifiedOn; }     private set {modifiedOn = value;} } 

(you might have to use BindingFlags - I'll try in a moment)

Without a setter, you'd have to rely on patterns / field names (which is brittle), or parse the IL (very hard).

The following works fine:

using System; class Test {     private DateTime modifiedOn;     public DateTime ModifiedOn {              get { return modifiedOn; }         private set { modifiedOn = value; }     } } static class Program {     static void Main() {         Test p = new Test();         typeof(Test).GetProperty("ModifiedOn").SetValue(             p, DateTime.Today, null);         Console.WriteLine(p.ModifiedOn);     } } 

It also works with an auto-implemented property:

public DateTime ModifiedOn { get; private set; } 

(where relying on the field-name would break horribly)

like image 152
Marc Gravell Avatar answered Nov 15 '22 13:11

Marc Gravell