我想像下面C#:限制在方法参数(非通用参数)类型
public void Foo(System.Type t where t : MyClass)
{ ... }
换句话说编写的函数,自变量类型是System.Type
,我想限制所允许的Type
s来自MyClass
。
有什么办法可以在语法上指定,或者t
必须在运行时检查吗?
我想像下面C#:限制在方法参数(非通用参数)类型
public void Foo(System.Type t where t : MyClass)
{ ... }
换句话说编写的函数,自变量类型是System.Type
,我想限制所允许的Type
s来自MyClass
。
有什么办法可以在语法上指定,或者t
必须在运行时检查吗?
如果您的方法必须采用Type类型作为参数,我认为没有办法做到这一点。如果你有方法调用的灵活性,你可以这样做:public void Foo(MyClass myClass),并通过调用.GetType()来获得Type。
扩大一点。 System.Type是参数的类型,所以没有办法进一步指定应该传递什么。就像一个采用1到10之间的整数的方法一样,必须接受一个int,然后执行运行时检查,以确保限制得到适当的遵守。
你为什么不使用
public void foo<t>();
呢?
你想要的东西理论上可以用属性来完成。但是,这是更清楚(IMO)和不完全一样的东西:
public void Foo(MyClass m) {
Type t = m.GetType();
// ...
}
当然,如果它为空则不起作用。 :) – 2009-05-20 03:30:26
您可以使用以下方法:
public void Foo<T>(T variable) where T : MyClass
{ ... }
召唤就会像下面这样:
{
...
Foo(someInstanceOfMyClass);
...
}
指定类型为MyClass,或从中派生,是对参数本身的值检查。这就好像说出你好参数
void Foo(int hello) {...}
必须在10到100之间。
您必须在运行时使用泛型或检查类型,就像其他参数值检查一样。
您还可以使用扩展方法,这将是适用于所有对象转换为MyClass的:
public static class MyClassExtensions
{
public static void Foo(this MyClass obj)
{
// ...
}
}
而且你可以使用它,就像它是一个对象的普通方法:
var x = new MyClass();
x.Foo();
也许你的方法是错误的。我看这个的方式,在MyClass上创建实例方法Foo()会容易得多,这样所有派生类都可以调用Foo,并且可以使用this.GetType()执行相同的行为,而无需额外的完整性检查。 – Juliet 2009-05-20 03:23:43
我这样做的反射功能 - 在函数内,我需要访问类型的属性。 – kpozin 2009-05-20 03:39:13