内部类和公共构造函数-为什么它与Activator.CreateInstance一起使用?

美茶

我想通过创建一些类的实例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 Foopublic一切都将被罚款(班逗留internal!)。

因此,我可以理解这Activator.CreateInstance(...)需要公共访问权限(他来自程序包外部),但是为什么在剩下的内部类中可能实现这种访问?

到目前为止,我认为当类是内部的 并且 构造函数是公共的时,它与类是内部的 并且 构造函数也是内部的(对于某种层次的访问层)是一样的……但这似乎是错误的!

有人可以帮助我了解这里发生的情况吗-内部类中的公共构造函数为什么起作用?

迈克·佩伦努德

您需要指定BindingFlagsfor反射才能找到它:

(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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么在使用Activator.CreateInstance时需要定义无参数构造函数?

来自分类Dev

为什么在使用Activator.CreateInstance时需要定义无参数构造函数?

来自分类Dev

为什么decltype无法与重载函数一起使用?

来自分类Dev

为什么AOP和DI很少一起使用

来自分类Dev

为什么MockMVC和Mockito不能一起使用?

来自分类Dev

为什么filter和rowSums不能一起使用?

来自分类Dev

SFINAE和衰变不能一起使用。为什么?

来自分类Dev

为什么不将向量和列表一起使用?

来自分类Dev

为什么 HHVM 和 NGINX 一起使用?

来自分类Dev

为什么HMR和chunkhash不能一起使用?

来自分类Dev

为什么模板允许constexpr函数成员与非constexpr构造函数一起使用?

来自分类Dev

为什么不能要求构造函数并立即将其与browserify一起使用?

来自分类Dev

为什么不能要求构造函数并立即将其与browserify一起使用?

来自分类Dev

为什么ng-click在此指令中仅与函数一起使用,而不与赋值一起使用?

来自分类Dev

为什么使用扩展语法可与基元和函数一起使用?

来自分类Dev

为什么Assembly和Activator对于CreateInstance的行为有所不同

来自分类Dev

在shapefile中查找指向该点的多边形属于...为什么它与某些shapefile一起使用,而不与其他文件一起使用?

来自分类Dev

为什么使用函数声明不能与Web Worker一起使用?

来自分类Dev

为什么ResultSet.deleteRow()无法与使用Trim()函数的查询一起使用

来自分类Dev

什么是位图和位工厂,为什么人们将其与动画一起使用?

来自分类Dev

一起使用 WPF 和实体框架 - 什么架构?

来自分类Dev

为什么将emplace_back与删除的副本构造函数一起使用不起作用?

来自分类Dev

如何强制执行复制省略,为什么它不能与已删除的复制构造函数一起使用?

来自分类Dev

如何强制执行复制省略,为什么它不能与已删除的复制构造函数一起使用?

来自分类Dev

SQL计数不确定如何使它与模型,视图和控制器一起使用

来自分类Dev

为什么Windows没有与InitializeConditionVariable()一起使用的DeleteConditionVariable()函数?

来自分类Dev

为什么ADL无法与在命名空间之外定义的函数一起使用?

来自分类Dev

为什么我不能将javascript setInterval与外部文件中的函数一起使用?

来自分类Dev

为什么与dplyr的mutate一起使用时,摘要函数每次都返回相同的值?

Related 相关文章

  1. 1

    为什么在使用Activator.CreateInstance时需要定义无参数构造函数?

  2. 2

    为什么在使用Activator.CreateInstance时需要定义无参数构造函数?

  3. 3

    为什么decltype无法与重载函数一起使用?

  4. 4

    为什么AOP和DI很少一起使用

  5. 5

    为什么MockMVC和Mockito不能一起使用?

  6. 6

    为什么filter和rowSums不能一起使用?

  7. 7

    SFINAE和衰变不能一起使用。为什么?

  8. 8

    为什么不将向量和列表一起使用?

  9. 9

    为什么 HHVM 和 NGINX 一起使用?

  10. 10

    为什么HMR和chunkhash不能一起使用?

  11. 11

    为什么模板允许constexpr函数成员与非constexpr构造函数一起使用?

  12. 12

    为什么不能要求构造函数并立即将其与browserify一起使用?

  13. 13

    为什么不能要求构造函数并立即将其与browserify一起使用?

  14. 14

    为什么ng-click在此指令中仅与函数一起使用,而不与赋值一起使用?

  15. 15

    为什么使用扩展语法可与基元和函数一起使用?

  16. 16

    为什么Assembly和Activator对于CreateInstance的行为有所不同

  17. 17

    在shapefile中查找指向该点的多边形属于...为什么它与某些shapefile一起使用,而不与其他文件一起使用?

  18. 18

    为什么使用函数声明不能与Web Worker一起使用?

  19. 19

    为什么ResultSet.deleteRow()无法与使用Trim()函数的查询一起使用

  20. 20

    什么是位图和位工厂,为什么人们将其与动画一起使用?

  21. 21

    一起使用 WPF 和实体框架 - 什么架构?

  22. 22

    为什么将emplace_back与删除的副本构造函数一起使用不起作用?

  23. 23

    如何强制执行复制省略,为什么它不能与已删除的复制构造函数一起使用?

  24. 24

    如何强制执行复制省略,为什么它不能与已删除的复制构造函数一起使用?

  25. 25

    SQL计数不确定如何使它与模型,视图和控制器一起使用

  26. 26

    为什么Windows没有与InitializeConditionVariable()一起使用的DeleteConditionVariable()函数?

  27. 27

    为什么ADL无法与在命名空间之外定义的函数一起使用?

  28. 28

    为什么我不能将javascript setInterval与外部文件中的函数一起使用?

  29. 29

    为什么与dplyr的mutate一起使用时,摘要函数每次都返回相同的值?

热门标签

归档