2010-03-06 3 views
6

Кто-нибудь есть быстрый фрагмент или направление, как я бы проверить, является ли данный класс поддерживает >, = и < операторов?Как определить, поддерживает ли объект скалярные сравнения?

Учитывая объект прошел, я ищу код, который реализует следующую логику:

If GetType(someObj).SupportsScalarComparisons() Then ... 

Я не знаю, если это случай для размышлений, или? Заранее спасибо.

ответ

2

Я думал, что это интересный вопрос, поэтому я решил использовать отражение, чтобы придумать решение. (Я не знаю, если есть другой способ, кроме отражения.)


Imports System.Reflection 

Module MainModule 

    Sub Main() 

     'primitive, value type 
     If GetType(Integer).SupportsScalarComparisons Then 
      Debug.WriteLine("Integer supports comparisions") 
     Else 
      Debug.WriteLine("Integer does not support comparisions") 
     End If 

     'non-primitive, value type 
     If GetType(Decimal).SupportsScalarComparisons Then 
      Debug.WriteLine("Decimal supports comparisions") 
     Else 
      Debug.WriteLine("Decimal does not support comparisions") 
     End If 

     'non-primitive, object type 
     If GetType(Version).SupportsScalarComparisons Then 
      Debug.WriteLine("Version supports comparisions") 
     Else 
      Debug.WriteLine("Version does not support comparisions") 
     End If 

     'non-primitive, object type 
     If GetType(String).SupportsScalarComparisons Then 
      Debug.WriteLine("String supports comparisions") 
     Else 
      Debug.WriteLine("String does not support comparisions") 
     End If 

     'Integer supports comparisions 
     'Decimal supports comparisions 
     'Version supports comparisions 
     'String does not support comparisions 

    End Sub 

    Public Sub Dump(ByVal type As Type) 
     Dim oMethod() As MethodInfo = type.GetMethods(BindingFlags.Static Or BindingFlags.Public) 
     For Each o As MethodInfo In oMethod 
      Debug.WriteLine(o.Name) 
     Next 
    End Sub 

End Module 

Public Module TypeExtensions 

    <System.Runtime.CompilerServices.Extension()> _ 
    Public Function SupportsScalarComparisons(ByVal obj As Type) As Boolean 
     Static Methods() As String = {"op_GreaterThan", "op_Equality", "op_LessThan"} 

     If obj.IsPrimitive Then 
      Return True 
     End If 

     For Each sMethodName As String In Methods 
      Dim oMethod As MethodInfo = obj.GetMethod(sMethodName, BindingFlags.Public Or BindingFlags.Static) 
      If oMethod Is Nothing Then 
       'does not support 
       Return False 
      End If 
     Next 

     Return True 

     'List is from MSDN Library index 
     'op_Addition 
     'op_BitwiseAnd 
     'op_BitwiseOr 
     'op_Decrement 
     'op_Division 
     'op_Equality 
     'op_ExculsiveOr 
     'op_Explicit 
     'op_False 
     'op_GreaterThan 
     'op_GreaterThanOrEqual 
     'op_Implicit 
     'op_Increment 
     'op_Inequality 
     'op_LogicalNot 
     'op_LessThan 
     'op_LessThanOrEqual 
     'op_Modulus 
     'op_Multiply 
     'op_OnesComplement 
     'op_Subtraction 
     'op_True 
     'op_UnaryNegation 
     'op_UnaryPlus 

    End Function 

End Module 
+0

Прохладный! Это работало абсолютно отлично! Затем я задавался вопросом, как вообще называть сравнительные операторы на моем родовом типе; завершались с использованием делегатов Func типа Func (из объекта Object, Object, Boolean). Спасибо за вашу помощь и руководство, ура! – eidylon

0

Try поймать все, что вы хотите сделать ... если вы ловите, то вы не можете.

+0

Ну, я хочу использовать это в родовом, но я хочу, чтобы generic поддерживал только типы, поддерживающие скалярные сравнения, поэтому я проверю это в конструкторе generic, после чего у меня нет никаких действительных экземпляров обобщенного для сравнения. – eidylon

Смежные вопросы