2

可能重复:
如何在 C# 中调用受保护的构造函数?

我搜索了我的问题的解决方案。
其实我不知道有没有可能。请帮我。

namespace namespace1
{
    namespace namespace1a
    {
        public class classa
        {
            protected classa(string i) //protected constructor
            {
                //Do something
            }
            public classa() //public constructor
            {
                //Do something
            }

        }
    }

    namespace namespace1b
    {
        public class classb
        {
            classa i = new classa(); // calls public constructor of classa

            classa j = new classa("hi"); //Invalid. How to call the protected constructor of classa
        }
    }
}  

我想从“ classb ”调用“ classa ”的受保护构造函数,怎么做?请帮我。

4

5 回答 5

3

如果

  • classa并且classb在同一个程序集中
  • 您正在创作这两个课程
  • 您正在尝试保护classa的构造函数。

那么您可以将构造函数声明为protected internal

于 2012-05-30T17:12:20.277 回答
2

您可以使用反射从类型的元数据中获取对要调用的构造函数的引用:

var ctor = typeof(classa).GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, new[] { typeof(string) }, null);

一旦你有了对构造函数的引用,你就可以调用它,传入你想要给构造函数的参数作为对象数组:

var instance = (classa)ctor.Invoke(new object[] { "Chicken butt" });

话虽如此,构造函数可能受到保护是有原因的,并且使用反射来规避类型成员的封装通常不是一个好主意。

于 2012-05-30T17:05:24.463 回答
1

一种安全的方法是添加一个代理类,该类继承自classb一个带有字符串的公共构造函数。受保护的合同是明确定义的。

class bproxy : classb
{
     public bproxy(string x) : base(x) {...}
}

另一种方法是使用反射。老实说,我不建议这样做,因为当作者将构造函数设置为受保护时,它只能由其自身和派生类使用。您还与未明确定义的“合同”紧密耦合。

话虽如此,这应该对您有用,尽管一旦作者更改合同的非保证部分(使用风险自负),它就会中断:

var constructor = typeof(classa).GetConstructors(BindingFlags.NonPublic | BindingFlags.Instance);
var b = constructor.First().Invoke(new object[] {"hi"});
于 2012-05-30T17:01:40.380 回答
0

除非 classb 从 classa 派生,否则这是不可能的。Protected 使构造函数仅对类本身和从 classa 派生的每个类可见。

看看这里:受保护的 C#

于 2012-05-30T16:50:20.743 回答
0

您的问题与此问题重复。
除了从 classa 派生之外,反射是一个有用的选项(通过查询 tpye 的构造函数,然后运行合适的构造函数,如提供的链接中的答案之一所述)

于 2012-05-30T16:59:16.393 回答