.NET Reflection设置私有属性

如果您有一个如下定义的属性:

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

如何使用Reflection将其设置为某个值?

我试过了两个:

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

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

但没有任何成功。 很抱歉,如果这是一个愚蠢的问题,但这是我第一次使用Reflection with C#.NET。

那没有二传; 你需要:

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

(你可能不得不使用BindingFlags – 我会稍等一下)

没有setter,你必须依赖模式/字段名称(这是脆弱的),或解析IL(非常难)。

以下工作正常:

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

它也适用于自动实现的属性:

 public DateTime ModifiedOn { get; private set; } 

(依赖于字段名称会破坏可怕的)

您可以尝试设置支持字段而不是属性; 你应该使用GetField()而不是GetProperty()

如果您的酒店没有设置者,则无法在其上调用SetValue。

您需要设置该字段,因为您没有设置属性的set属性。 另外,对于非公共对象,还需要BindingFlags.NonPublic。

 dto.GetType(). GetField("modifiedOn", BindingFlags.NonPublic|BindingFlags.SetField|BindingFlags.Instance). SetValue(dto, valueToSet); 

如果你有一个带有setter的私有属性,那么你可以使用这个Extension方法来设置一个值:

 using System.Reflection; public static class ObjectExtensions { public static void SetPrivateValue(this T obj, string propertyName, object value) { var type = typeof(T); type.GetTypeInfo().GetDeclaredProperty(propertyName).SetValue(obj, value, null); } }