C# 具有命名空间限制的泛型类型

C# 具有命名空间限制的泛型类型,c#,generics,C#,Generics,大家都知道 public class Test<T> where T : SomeBaseClass 致以最诚挚的问候否。没有办法将泛型类型约束到名称空间。否。约束是关于指定行为-无论是作为类、实现给定接口还是其他简单的行为。它不是关于在哪个名称空间中定义一个类——这并没有说明它的行为 请参阅以获取约束摘要命名空间约束不可能。无论如何,这没有任何意义,因为每个人都可以创建位于目标命名空间中的类。如果您可以将其限制为特定的程序集,则可能只有这样做才有意义 如果您可以将其限制为n类型,

大家都知道

public class Test<T> where T : SomeBaseClass

致以最诚挚的问候

否。没有办法将泛型类型约束到名称空间。

否。约束是关于指定行为-无论是作为类、实现给定接口还是其他简单的行为。它不是关于在哪个名称空间中定义一个类——这并没有说明它的行为


请参阅以获取约束摘要

命名空间约束不可能。无论如何,这没有任何意义,因为每个人都可以创建位于目标命名空间中的类。如果您可以将其限制为特定的程序集,则可能只有这样做才有意义

如果您可以将其限制为
n
类型,如以下行(不起作用),则会更有意义:

public T Create(),其中T:{MyClass1,MyClass2}
请参见约束

您可以通过创建一个具有内部作用域的接口,并在泛型where子句中使用该接口(泛型类/方法需要在同一程序集中)来实现这一点。然后,您将只能对实现该接口的同一程序集中的类使用它

如果需要从另一个程序集传递类,可以向AssemblyInfo文件添加global::InternalsVisibleToAttribute(“其他程序集名称”)


尽管如此,它听起来仍然不像是要尝试和实现的那种东西。

名称空间只是名称,它们对类型的契约没有贡献(与继承或接口实现相反)。泛型类型约束是关于契约假设的,因此它们的名称空间是无关的。实际上,忽略这一点,您可以将泛型方法设置为内部方法。
public class Test<T> where T in SomeNamespace
public T Create<T>() where T : { MyClass1, MyClass2 }