使用反射在`this`类中查找私有字段,并实例化它

时间:2018-04-07 14:33:41

标签: c# reflection automation

假设情况。假设我有一个包含许多私有字段的类。我希望它能够使用正确的type实例化它可以找到的每个字段。到目前为止,我已经使用了

public class TestClass
{
    private SomeClass sc;
    private AnotherClass ac;

    public TestClass()
    {
        var type = GetType();
        var fields = type.GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
            .Select(x => x.Name)
            .ToList();

        foreach (var f in fields)
            type.GetField(f).SetValue(/*instantiate here*/);
    }
}

如何实例化它? (这假设每个类中的new()构造函数是无参数的并且不是空的)

1 个答案:

答案 0 :(得分:2)

Activator.CreateInstance(Type)可以从该类型创建实例。这需要一个无参数的构造函数(参数有重载)。

要使用它,只需稍微修改一下代码:

public class TestClass
{
    private SomeClass sc;
    private AnotherClass ac;

    public TestClass()
    {
        var type = GetType();

        type.GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
            .ToList()
            .ForEach(f => {
                f.SetValue(this, Activator.CreateInstance(f.FieldType);
            });
    }
}