如何初始化 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 受到限制是有原因的)
- 联系作者
- 反思
我有一个 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 受到限制是有原因的)
- 联系作者
- 反思