2009-04-08 53 views
4

这是两个问题(比另一个更具体)。我可以限定VB.NET中的参数类型吗?

如果我有这样的方法:

Public Function Blah(String Foo) 
End Function 

我可以出线美孚对另一种类型(例如我可以要求富是一个字符串,也实现了IInterface?)。

我想象隐约类似于此:

Public Function Blah(RandomObject Foo Where RandomObject Is IInterface) 
End Function 

另外,有没有什么办法来限定类型参数?

例如,我可以要求Type I作为参数采用特定的类树吗?

Public Function Blah(Type t Where Type Of String) 
End Function 

我要指出,我在属性的属性的情况下使用此所以类声明本身不能通用(这纯粹是集中在排位赛的方法参数,而不是键入类及其方法)。

回答

3

这看起来像泛型对我来说的情况。你的方法签名会是这样在VB.NET:

Public Function Blah(Of T As {IImplementedByT})(Foo As T) 

这指定富可以是任何类型T,只要为T实现IImplementedByT。请注意,如果不包含需要通用的类,此方法可以是通用的。如果你想吨至从RandomClass派生的类也实现了该接口,您可以指定两个约束:

Public Function Blah(Of T As {RandomClass, IImplementedByT})(Foo As T) 
+0

谢谢 - 这很有趣也很实用,但我发现我想做的事情是别的。我试图将这应用于属性,但不能在set子句中使用类型参数。 – 2009-04-08 07:01:43

0

不确定你的意思是“Foo是一个也实现IInterface的字符串”。

字符串类是密封的,所以你不能从它继承&因此你不能在它上面实现一个接口。

我希望我在正确的页面上。

+0

好吧字符串是一个不好的例子,假设一个非密封类即可。 – 2009-04-08 06:41:52

1

您可以对通用类型执行第一个操作,但不适用于非通用类型。基本上一个变量(包括一个参数)只能有一个编译时类型,所以你不能说“它必须是FooIBar--你必须选择一个或另一个。泛型让你说”它有是某种类型的T其中TFoo派生并实现IBar“虽然

泛型是一个很大的话题 - 太大堆​​栈溢出的答案覆盖 - 但微软有一个good introductory article

至于你的第二个问题 - 不,你不能这样做,Type的值只会在执行时知道,所以它必须是执行时间检查。但是,有一种情况,用Type.IsAssignableFrom

+0

谢谢 - 我认为我很了解泛型,但似乎无法获得VB.NET语法对合格方法的正确判断,除非我也限定了该类。至于类型检查,我想这是编译器可以处理的一件事,但你是对的,我没有考虑动态类型。 – 2009-04-08 06:56:22

相关问题