在AssemblyOne中考虑
public class A
{
internal A (string s)
{ }
}
public class B : A
{
internal B (string s) : base(s)
{ }
}
在AssemblyTwo
public class C : B
{
// Can't do this - ctor in B is inaccessible
public C (string s) : base(s)
}
显然这是一种代码气味,但不管是不是一个坏主意,是否可以在不改变AssemblyOne的情况下从C的ctor调用B的ctor?
答案 0 :(得分:5)
暂时忽略大会二。您将无法实例化C类的实例,因为它继承自B,没有公共构造函数。
因此,如果从C类中删除继承问题,由于保护级别的原因,您仍然无法在B的程序集之外创建B类实例。但是,您可以使用反射来创建B的实例。
出于测试目的,我按如下方式更改了类:
public class A
{
internal A(string s)
{
PropSetByConstructor = s;
}
public string PropSetByConstructor { get; set; }
}
public class B : A
{
internal B(string s)
: base(s)
{
PropSetByConstructor = "Set by B:" + s;
}
}
然后我写了一个控制台应用程序来测试:
static void Main(string[] args)
{
System.Reflection.ConstructorInfo ci = typeof(B).GetConstructors(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)[0];
B B_Object = (B)ci.Invoke(new object[]{"is reflection evil?"});
Console.WriteLine(B_Object.PropSetByConstructor);
Console.ReadLine();
}
我不建议这样做,这只是不好的做法。我想在所有事情中都有例外,这里的例外可能不得不处理你无法扩展的第三方库。如果不是继承,这将为您提供实例化和调试的方法。
答案 1 :(得分:2)
即使有了反思,这也是不可能的。
如果一个类没有可访问的构造函数,则无法创建继承它的类。
答案 2 :(得分:1)
不,您必须更改AssemblyOne。