我希望能够从内部派生一个类,但不允许其他程序集中的类派生自该类

Rok*_*kke 1 c# reflection

HEJ

我有以下设置:

大会1

public abstract class XX<T> : XX where T: YY { }
public abstract class XX {}
Run Code Online (Sandbox Code Playgroud)

大会2

public class ZZ : YY {}
public class ZZFriend : XX<ZZ> {}
Run Code Online (Sandbox Code Playgroud)

我在YY中使用此功能进行反射:

public class YY {
  public Type FindFriend {
    return GetType().Assembly.GetTypes().FirstOrDefault(
      t => t.BaseType != null &&
      t.BaseType.IsGenericType &&
      typeof(XX).IsAssignableFrom(t) &&
      t.BaseType.GetGenericArguments().FirstOrDefault() == GetType());
  }
}
Run Code Online (Sandbox Code Playgroud)

我想不要继承非泛型类XX的继承:

public class ZZFriend: XX {}
Run Code Online (Sandbox Code Playgroud)

或者,我需要一个方法(可以在YY.FindFrind()中的反射中使用):

public Type F(Type t) {
  return GetTypeThatIsGeneric(XX, Type genericTypeParameter);
}
Run Code Online (Sandbox Code Playgroud)

这可以在YY中用作:

Typeof(XX<ZZ) == F(typeof(GetType())
Run Code Online (Sandbox Code Playgroud)

希望有道理......

提前致谢

SørenRokkedal

Jon*_*eet 6

您可以在XX以下位置创建内部构造函数:

public abstract class XX
{
    internal XX()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

(或者,如果您已经有明确声明的构造函数,请将它们全部设置为私有或内部.)

这将阻止任何其他程序集声明派生类,因为没有构造函数可以链接到.

  • @Jodrell:你不能从不同的程序集声明该类,因为它*隐式*调用`base()`,这是不可访问的. (3认同)