2016-11-20 94 views
0

是否可以在類的構造函數之前爲某個字段或屬性賦值並使用反射?在構造函數之前設置字段或屬性值

謝謝

+1

問yes或no的問題一般是非生產性的誰問的人,誰的答案,誰在未來的讀取。也許編輯你的問題? –

+2

你爲什麼要那樣做? –

回答

2

是的,有一種偷偷摸摸的方式來做到這一點。祕密醬是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; } 
} 
+0

你是唯一瞭解我的問題的人。 非常感謝,這正是我想要的。 – Junior

2

如果你指的是一個字段或屬性就是非靜態,答案是否定的。

在構造函數被調用之前,您實際上並沒有該類的實例,所以您將不會有任何實例來設置該字段或屬性。

但是,如果你只是想提供一個類的默認值。您可以通過在字段或屬性聲明之後添加默認分配來完成此操作。

像這樣;

public class MyClass 
{ 
    public string MyString { get; set; } = "Default Value"; 

    public MyClass() 
    { 

    } 
} 

現在,MyClass的每個實例都有一個屬性MyString,其值爲「默認值」,直到它被重新分配爲止。

+0

謝謝,但你不明白我的問題。他明白,看看邁克的迴應。 – Junior

相關問題