使用带反射的内部构造函数实例化Type

时间:2017-01-31 15:11:18

标签: c# constructor internal system.reflection .net-standard

我有一个需要实例化未知类的工厂类。 它是这样做的:

public class Factory
{
    public void SetFoo(Type f)
    {
        Activator.CreateInstance(f);
    }
}

问题是我希望该构造函数是内部的,但将其标记为内部会给我一个MissingMethodException,但构造函数位于同一个程序集中。 如果它设置为puclic它可以正常工作。

我尝试过这里提供的解决方案 How to create an object instance of class with internal constructor via reflection?

在这里 Instantiating a constructor with parameters in an internal class with reflection

转化为这样做:

Activator.CreateInstance(f,true)

但没有成功......

我正在使用带有System.Reflection(4.3.0)的NETStandard.Library(1.6.1)

更新

本次更新时提供的答案指出了我正确的方向:

var ctor = f.GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic);

var instance = (f)ctor[0].Invoke(null);

谢谢你们!

3 个答案:

答案 0 :(得分:3)

的BindingFlags:

var ctor = typeof(MyType)..GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic).FirstOrDefault(c => !c.GetParameters().Any());

var instance = (MyType)ctor.Invoke(new object[0]);

BindingFlags获取非公共构造函数。通过指定的参数类型(或者更确切地说缺少参数)找到特定的构造函数。 Invoke调用构造函数并返回新实例。

答案 1 :(得分:0)

首先,您需要找到构造函数:

var ctor = typeof(MyType).GetTypeInfo().GetConstructors(BindingFlags.NonPublic | BindingFlags.Instance).Single(x => /*filter by the parameter types*/);
var instance = ctor.Invoke(parameters) as MyType;

请添加对System.Reflection命名空间的引用。

答案 2 :(得分:0)

您可以通过反射检索构造函数,然后调用它。

var ctor = typeof(Test)
    .GetConstructors(
        BindingFlags.NonPublic | 
        BindingFlags.Public | 
        BindingFlags.Instance
    )
    .First();
var instance = ctor.Invoke(null) as Test;