簡體   English   中英

在構造函數之前設置字段或屬性值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM