[英]Preferred method to set the value of a get only Property: constructor vs backing field
[英]Set field or property value before constructor
是否可以在類的構造函數之前為字段或屬性賦值並使用反射?
謝謝
是的,有一種偷偷摸摸的方式來做到這一點。 秘訣是FormatterServices.GetUninitializedObject ,它將分配一個實例但不運行構造函數。 您可以通過反射設置字段和屬性,然后運行構造函數。
一個簡單的例子:
class Program
{
static void Main(string[] args)
{
object obj = FormatterServices.GetUninitializedObject(typeof(A));
obj.GetType().GetProperty("I").SetValue(obj, 1);
obj.GetType().GetConstructor(Type.EmptyTypes).Invoke(obj, null);
Console.WriteLine("Done");
}
}
class A
{
public A()
{
if (I != 0)
{
Console.WriteLine("Who set me? I = {0}", I);
}
}
public int I { get; set; }
}
如果您指的是非靜態的字段或屬性,答案是否定的。
在調用構造函數之前,您實際上沒有該類的實例,因此您將沒有任何實例來設置字段或屬性。
但是,如果您只想為類提供默認值。 您只需在字段或屬性聲明后添加默認分配即可。
像這樣;
public class MyClass
{
public string MyString { get; set; } = "Default Value";
public MyClass()
{
}
}
現在,MyClass的每個實例都將具有一個屬性MyString,其值為“Default Value”,直到它被重新分配。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.