在构造函数之前设置字段或属性值

时间:2016-11-20 03:59:42

标签: c# reflection

是否可以在类的构造函数之前为字段或属性赋值并使用反射?

谢谢

2 个答案:

答案 0 :(得分:5)

是的,有一种偷偷摸摸的方式来做到这一点。秘密酱是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; }
}

答案 1 :(得分:1)

如果您指的是非静态的字段或属性,则答案为否。

在调用构造函数之前,您实际上没有该类的实例,因此您不会有任何实例来设置字段或属性。

但是,如果您只想为类提供默认值。您只需在字段或属性声明后添加默认分配即可。

像这样;

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

    public MyClass()
    {

    }
}

现在,MyClass的每个实例都将拥有一个属性MyString,其值为"默认值"直到它被重新分配。