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

时间:2009-05-20 03:15:53

标签: c# .net types polymorphism

我想编写类似下面的函数

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

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

有没有办法在语法上指定它,还是必须在运行时检查t

6 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:3)

指定类型为MyClass,或从中派生出来,是对参数本身的值检查。这就像在

中说出hello参数
void Foo(int hello) {...}

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

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

答案 2 :(得分:2)

您可以使用以下内容:

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

电话会议如下:

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

为什么不使用

public void foo<t>();

代替?

答案 5 :(得分:0)

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

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

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

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