2010-03-06 10 views
6

Hat jemand einen schnellen Schnipsel oder Richtung, wie ich überprüfen würde, wenn eine bestimmte Klasse die >, = und < Betreiber unterstützt zu sehen?Wie kann man feststellen, ob ein Objekt skalare Vergleiche unterstützt?

ein Objekt übergibt in Given, ich bin auf der Suche nach Code, der die folgenden Logik implementiert:

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

Ich weiß nicht, ob dies ein Fall für die Reflexion ist, oder? Danke im Voraus.

Antwort

2

Ich dachte, das sei eine interessante Frage, also entschied ich mich, mit Reflektion eine Lösung zu finden. (Ich weiß nicht, ob es eine andere Möglichkeit, außer Reflexion.)


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

Cool! Das hat absolut perfekt funktioniert! Ich habe mich dann gefragt, wie ich die Vergleichsoperatoren meines generischen Typs nennen könnte. aufgewickelt mit Func Delegaten des Typs Func (Of Object, Object, Boolean). Danke für deine Hilfe und Richtung, Prost! – eidylon

0

Try-Catch, was auch immer Sie ... tun, wenn Sie fangen, dann können Sie nicht.

+0

Nun, ich möchte dies in einem generischen verwenden, aber ich möchte das generische nur Typen unterstützen, die skalare Vergleiche unterstützen, also werde ich dies im generischen Konstruktor überprüfen, zu welchem ​​Zeitpunkt ich keine gültigen Instanzen des generischen habe Parameter zum Vergleichen. – eidylon

Verwandte Themen