如何初始化 get-only 属性 C#

How to initialize get-only property C#

我有一个 class 这样的:

public class Customer
{
  public int Id { get; set; }
  public string FullName { get; set; }
  public string Address{ get; }
}

如何初始化此 class 的实例并设置 'Address' 只获取 属性 值? 我试过

var customer = new Customer 
{
  Id = 228,
  FullName = "Peter",
  Address = "Kreshatik",
};

但它不起作用。

请注意,这不是我的 class,我无法更改那里的任何内容。

//using System.Reflection;

var backingField = typeof(Customer).GetField("<Address>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance);

var customer = new Customer
{
    Id = 228,
    FullName = "Peter",
};

backingField.SetValue(customer, "Kreshatik");

如果 backingField 为 null,您需要通过反射进行更深入的挖掘才能找到它。

您可以使用 GetFields(...) 和相同的标志来列出它们。

一旦你弄清楚了所有这些,你就可以创建一个扩展方法:

public static class CustomerExtensions
{
    static FieldInfo addressField = typeof(Customer).GetField("<Address>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance);

    public static void SetAddress(this Customer customer, string address)
    {
        addressField.SetValue(customer, address);
    }
}

并这样使用它:

var customer = new Customer
{
    Id = 228,
    FullName = "Peter",
};

customer.SetAddress("Kreshatik");

完全同意@rfmodulator 之前的回答,在给定的情况下反射是唯一可能的解决方案。我解决这个问题的步骤是:

  • 检查所有构造函数中的参数
  • 检查 public setter 方法
  • 如果您有权访问源代码,请检查地址引用(也许最初的目的是完全不同的,并且它的 setter 受到限制是有原因的)
  • 联系作者
  • 反思