2010-03-06 9 views
6

¿Alguien tiene un fragmento rápida o la dirección de cómo me gustaría comprobar para ver si una determinada clase apoya la >, = y < operadores?¿Cómo saber si un objeto admite comparaciones escalares?

Dado un objeto pasado en, Busco código que implementa la siguiente lógica:

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

No sé si esto es un caso para la reflexión, o? Gracias por adelantado.

Respuesta

2

Pensé que era una pregunta interesante, así que decidí usar la reflexión para encontrar una solución. (No sé si hay otra manera, además de la reflexión.) Captura


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

¡Genial! Eso funcionó absolutamente perfectamente! Entonces me preguntaba cómo llamar a los operadores comparativos en mi tipo genérico; terminó usando Func delegados de tipo Func (Of Object, Object, Boolean). Gracias por su ayuda y dirección, ¡salud! – eidylon

0

Try lo que quieres hacer ... si se captura a continuación, no se puede.

+0

Bueno, quiero usar esto de forma genérica, pero quiero que el genérico solo admita tipos que admitan comparaciones escalares, por lo que verifico esto en el constructor del genérico, en ese punto no tengo ninguna instancia válida del genérico parámetro para intentar comparar. – eidylon

Cuestiones relacionadas