如何设置.NET反射集的私有属性?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (31)

如果您有这样定义的属性:

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

如何通过反射将其设置为某个值?

我都试过了:

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

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

但没有成功。

提问于
用户回答回答于

你需要:

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().

扫码关注云+社区

领取腾讯云代金券