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