2009-05-20 57 views
8

我想像下面C#:限制在方法参数(非通用参数)类型

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

换句话说编写的函数,自变量类型是System.Type,我想限制所允许的Type s来自MyClass

有什么办法可以在语法上指定,或者t必须在运行时检查吗?

+0

也许你的方法是错误的。我看这个的方式,在MyClass上创建实例方法Foo()会容易得多,这样所有派生类都可以调用Foo,并且可以使用this.GetType()执行相同的行为,而无需额外的完整性检查。 – Juliet 2009-05-20 03:23:43

+0

我这样做的反射功能 - 在函数内,我需要访问类型的属性。 – kpozin 2009-05-20 03:39:13

回答

9

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

扩大一点。 System.Type是参数的类型,所以没有办法进一步指定应该传递什么。就像一个采用1到10之间的整数的方法一样,必须接受一个int,然后执行运行时检查,以确保限制得到适当的遵守。

0

你为什么不使用

public void foo<t>(); 

呢?

1

你想要的东西理论上可以用属性来完成。但是,这是更清楚(IMO)和不完全一样的东西:

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

当然,如果它为空则不起作用。 :) – 2009-05-20 03:30:26

2

您可以使用以下方法:

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

召唤就会像下面这样:

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

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

void Foo(int hello) {...} 

必须在10到100之间。

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

0

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

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

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

var x = new MyClass(); 
x.Foo(); 
相关问题