我想通过创建一些类的实例Activator.CreateInstance(...)
。所有类都继承相同的抽象类。构造函数有一个参数。
类和构造函数不应是公共的。
这就是我想要的代码(但不能得到):
internal abstract class FooAbstract
{
protected Bar MyProperty { get; set; }
// Constructor is only need in concreat classes of FooAbstract
protected FooAbstract(Bar barProperty)
{
MyProperty = barProperty;
}
}
internal class Foo : FooAbstract
{
// Internal is enough, public is not necessary
internal Foo(Bar barProperty)
: base(barProperty)
{
}
// Many more Foo´s ...
internal class Creator()
{
private object CreateAFoo<T>() where T : FooAbstract
{
T someFoo = (T)Activator.CreateInstance(typeof(T), barProperty);
}
}
但这会引发Exception Constructor on type 'Foo' not found
。
当我改变的构造函数FooAbstract
和 Foo
对public
一切都将被罚款(班逗留internal
!)。
因此,我可以理解这Activator.CreateInstance(...)
需要公共访问权限(他来自程序包外部),但是为什么在剩下的内部类中可能实现这种访问?
到目前为止,我认为当类是内部的 并且 构造函数是公共的时,它与类是内部的 并且 构造函数也是内部的(对于某种层次的访问层)是一样的……但这似乎是错误的!
有人可以帮助我了解这里发生的情况吗-内部类中的公共构造函数为什么起作用?
您需要指定BindingFlags
for反射才能找到它:
(T)Activator.CreateInstance(typeof(T),
BindingFlags.Instance | BindingFlags.NonPublic,
null
new object[] { barProperty },
null);
现在,在这种情况下,您确实需要构建一个,object[]
因为它不是params
。
正如马修·沃森(Matthew Watson)所说,我应该澄清反射的工作方式。也许更具体地说是修饰符。它们[修饰符]并不是为真正的保护而构建的。它们的构建是为了确定您在使用类型时可用的API。
但是,反射直接在修改器之外起作用。如果是public
-那么经过反思就是public
。层次结构无关紧要。记住,反射实际上可以访问private
成员。我知道,之前我不得不破解一些东西。
此外,构造函数不会继承的修饰符class
。默认的构造函数-如果未定义则由编译器生成-始终为 public
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句