C#:限制方法参数中的类型(不是通用参数)

我想编写如下函数

public void Foo(System.Type t where t : MyClass) { ... } 

换句话说,参数类型是System.Type ,我想将允许的Type限制为从MyClass派生的Type

有没有办法在语法上指定这个,或者必须在运行时检查?

如果你的方法必须采用Type类型作为它的参数,我认为没有办法做到这一点。 如果你有方法调用的灵活性,你可以这样做:public void Foo(MyClass myClass)和通过调用.GetType()来获取Type。

扩大一点。 System.Type是参数的类型,因此无法进一步指定应传递的内容。 就像采用1到10之间的整数的方法一样,必须采用int然后执行运行时检查是否正确遵守了限制。

将类型指定为MyClass或从中派生, 对参数本身的值检查 。 这就像说hello参数

 void Foo(int hello) {...} 

必须在10到100之间。在编译时无法检查。

您必须使用generics或在运行时检查类型,就像任何其他参数值检查一样。

您可以使用以下内容:

 public void Foo(T variable) where T : MyClass { ... } 

电话会议如下:

 { ... Foo(someInstanceOfMyClass); ... } 

理论上你可以用属性来完成你想要的东西。 但这更清楚(imo)并完全相同:

 public void Foo(MyClass m) { Type t = m.GetType(); // ... } 

你为什么不用

 public void foo(); 

代替?

您还可以使用扩展方法,该方法可用于所有可转换为MyClass的对象:

 public static class MyClassExtensions { public static void Foo(this MyClass obj) { // ... } } 

你可以使用它,就好像它是一个普通的对象方法:

 var x = new MyClass(); x.Foo();