使用带有反射的内部构造函数实例化类型
Instantiate Type with internal Constructor with reflection
我有一个工厂 class 需要实例化一个未知的 class。
它是这样做的:
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)
但没有成功...
我正在使用 NETStandard.Library (1.6.1) 和 System.Reflection (4.3.0)
更新:
本次更新时提供的答案为我指明了正确的方向:
var ctor = f.GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic);
var instance = (f)ctor[0].Invoke(null);
谢谢大家!
首先需要找到构造函数:
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 命名空间的引用。
您可以通过反射检索构造函数,并调用它。
var ctor = typeof(Test)
.GetConstructors(
BindingFlags.NonPublic |
BindingFlags.Public |
BindingFlags.Instance
)
.First();
var instance = ctor.Invoke(null) as Test;
绑定标志:
var ctor = typeof(MyType).GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic).FirstOrDefault(c => !c.GetParameters().Any());
var instance = (MyType)ctor.Invoke(new object[0]);
BindingFlags 获取非 public 构造函数。特定的构造函数是通过指定的参数类型(或者更确切地说是缺少参数)找到的。 Invoke 调用构造函数和 returns 新实例。
我有一个工厂 class 需要实例化一个未知的 class。 它是这样做的:
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)
但没有成功...
我正在使用 NETStandard.Library (1.6.1) 和 System.Reflection (4.3.0)
更新:
本次更新时提供的答案为我指明了正确的方向:
var ctor = f.GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic);
var instance = (f)ctor[0].Invoke(null);
谢谢大家!
首先需要找到构造函数:
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 命名空间的引用。
您可以通过反射检索构造函数,并调用它。
var ctor = typeof(Test)
.GetConstructors(
BindingFlags.NonPublic |
BindingFlags.Public |
BindingFlags.Instance
)
.First();
var instance = ctor.Invoke(null) as Test;
绑定标志:
var ctor = typeof(MyType).GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic).FirstOrDefault(c => !c.GetParameters().Any());
var instance = (MyType)ctor.Invoke(new object[0]);
BindingFlags 获取非 public 构造函数。特定的构造函数是通过指定的参数类型(或者更确切地说是缺少参数)找到的。 Invoke 调用构造函数和 returns 新实例。