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

本文关键字:派生 程序集 程序 其他 集中 在内部 我希望 不允许 | 更新日期: 2023-09-27 18:06:54

Hej

我有以下设置:

组件1

public abstract class XX<T> : XX where T: YY { }
public abstract class XX {}

组件2

public class ZZ : YY {}
public class ZZFriend : XX<ZZ> {}

我在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());
  }
}

我想禁止继承非泛型类XX,比如:

public class ZZFriend: XX {}

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

public Type F(Type t) {
  return GetTypeThatIsGeneric(XX, Type genericTypeParameter);
}

可以在YY中用作:

Typeof(XX<ZZ) == F(typeof(GetType())

希望这是有意义的。。。

提前感谢

Søren Rokkedal

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

您可以在XX:中创建内部构造函数

public abstract class XX
{
    internal XX()
    {
    }
}

(或者,如果您已经明确声明了构造函数,则将它们全部设置为私有或内部构造函数。(

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

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

只需更改构造函数internal,这将阻止其他程序集继承它,也会阻止构造它。不过,您可以在程序集之外使用它。

一个缺点是:如果您需要其他程序集来创建您类型的实例,则需要一个工厂方法来创建它的实例。