如何将Type类型限制为C#中的特定类型子集

时间:2017-03-19 16:16:09

标签: c# inheritance reflection types syntax

Type类型的变量可以包含任何类型。我需要的是一个变量,它只能包含继承特定类并实现特定接口的类型。如何指定?我已经尝试将变量声明为

Type: MyClass, IMyInterface theTypeVariable;

Type<MyClass, IMyInterface> theTypeVariable;

但不起作用。

正确的方法是什么?

例如

class A {...}

class B {...}

interface IC {...}

interface ID {...}

class E: B, IC {...}

class F: B, IC, ID {...}

class G: ID {...}

...

// This following line invalid actually,
// so it is pseudocode of a kind
// the syntactically and semantically correct form of this is the question
Type: B, IC theTypeVariable; // or Type<B, IC> theTypeVariable // perhaps

theTypeVariable = typeof(E); // This assignment is to be valid.

theTypeVariable = typeof(F); // This assignment is to be valid.

theTypeVariable = typeof(A); // This assignment is to be invalid.

theTypeVariable = typeof(B); // This assignment is to be invalid.

theTypeVariable = typeof(IC); // This assignment is to be invalid.

theTypeVariable = typeof(G); // This assignment is to be invalid.

更明确的例子:我可能想要声明一个类型变量,它只能包含任何扩展List<T>的类型并实现IDisposable(Ts的一次性列表,而不是一次性列表)

E.g。我将实施DisposableList<T>: List<T>, IDisposableAnotherDisposableListImplementation<T>: List<T>, IDisposable个类,我想要一个能够存储typeof(DisposableList<Foo>)typeof(AnotherDisposableListImplementation<Foo>)但不能存储typeof(Foo)typeof(List<Foo>)的变量

2 个答案:

答案 0 :(得分:1)

我相信这就是你要找的东西

 public class EstentedList<Type> where Type:List<T>,IDisposable
 {

 }

您可以将此类用作变量的类型

答案 1 :(得分:0)

Type包含有关类型的元数据;它是反射API的一部分。这是无效的:

Type x = 5;
Type y = "Hello Sailor!";

要使类型U成为T的子类型并实现接口I,您可以使用泛型:

... Foo<U>(...)
where U : T, I
{
  U myvar;
}

您可以通过以下方式创建新类型:

class MyType : MyClass, IMyInterface
{
  private MyClass A;
  private IMyInterface B;

  private MyType(MyClass a, IMyInterface b)
  {
    A = a;
    B = b;
  }

  public static MyType Create<U>(U x)
  where U : MyClass, IMyInterface
  {
    return new MyType(x, x);
  }

  // Implementations of MyClass and IMyInterface
  // which delegate to A and B.

}

现在,MyType类型的变量是MyClassIMyInterface的子类型。