对一般类型的委托和接口使用反射

时间:2009-08-24 05:44:45

标签: .net vb.net reflection

我有一堆类,每个类都有一个名为Sequence的属性。此属性是从名为ISequenced的接口实现的。对于此示例,我们可以调用其中一个类A.
当我有一个List(A)时,我希望能够使用标准List.Sort(addressof委托)对它们进行排序,其中委托是一个标准函数,它接收两个ISequenced对象并比较它们的序列号并返回一个布尔值标志,而不是为实现ISequenced的每个单独的类声明一个函数。

E.g。

Dim li as List(of A) = GetValues()

li.Sort(addressof SortBySeq)

...

Public Function SortBySeq(ByVal ob1 as ISequenced, ByVal ob2 as ISequenced) as Boolean
   return ob1.Sequence.CompareTo(ob2.Sequence)
End If

编辑:使用上面的代码给出了以下错误:

  

“重载解析失败,因为没有   可以调用可访问的“排序”   这些论点:       'Public Sub Sort(比较为System.Comparison(Of A))':选项   Strict On不允许缩小范围   隐式类型之间的转换   方法'Public Function SortBySeq(ob1   如ISequenced,ob2 As ISequenced)As   整数'和委托'代表   函数比较(A)(x As A,y As   A)作为整数'。       'Public Sub Sort(比较作为System.Collections.Generic.IComparer(Of。)   A))':'AddressOf'表达式不能   转换成   “System.Collections.Generic.IComparer(中   A)'因为   “System.Collections.Generic.IComparer(中   A)'不是代表类型。“

我如何声明该功能才能执行此操作(如果甚至可以在VB.NET中使用?

谢谢, 戴恩。

2 个答案:

答案 0 :(得分:1)

实施IComparer。您需要的一切都是here

编辑: 哦,我明白了什么。具有Sequence属性的所有类必须实现可比较的接口。例如。使用IHaveSequence并执行IComparer< IHaveSequence取代。 IHaveSequence的定义应该是显而易见的。

答案 1 :(得分:0)

最后不需要实现IComparer,因为我只是比较小数。事实证明,.NET 3.5至少增加了一些代理人的协方差能力,所以我已升级到那个,我上面给出的例子似乎工作正常。