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

时间:2014-06-05 09:23:02

标签: c# reflection

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ørenRokkedal

2 个答案:

答案 0 :(得分:6)

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

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

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

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

答案 1 :(得分:2)

  

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

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

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