我想编写类似下面的函数
public void Foo(System.Type t where t : MyClass)
{ ... }
换句话说,参数类型为System.Type
,我想将允许的Type
限制为从MyClass
派生的那些。
有没有办法在语法上指定它,还是必须在运行时检查t
?
答案 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();