2010-02-03 5 views
2

Je crée dynamiquement des validateurs .NET et transmets la propriété que j'appelle et la valeur à une méthode qui invoque la propriété et fournit la valeur.Validateur de base .NET et réflexion

Cela fonctionne pour la plupart des propriétés. Mais lorsque j'essaie d'invoquer la méthode Opérateur ou la méthode Type du validateur de comparaison, j'obtiens une erreur indiquant que la propriété est introuvable. Le code que j'utilise est ci-dessous. Je sais qu'il faut gérer les erreurs, mais je suis encore au début du développement et je veux voir où ça explosera. Grâce au débogueur, je peux voir que le paramètre fourni en Obj est en fait un CompareValidator et possède les propriétés qui ne peuvent pas être trouvées. Je pensais que cela pourrait seulement être de trouver les propriétés de base, (je descendu au validateur de base dans l'appelant), mais cela fonctionne sur ControlToCompare qui n'est pas un membre de BaseValidator. Toute aide serait appréciée.

''' <summary> 
    ''' Invokes a property on the supplied object 
    ''' </summary> 
    ''' <param name="Obj">Object to invoke the property on</param> 
    ''' <param name="PropertyName">Name of the property to invoke</param> 
    ''' <param name="PropertyValue">Value of the property</param> 
    ''' <returns></returns> 
    ''' <remarks>Uses reflection to invoke the property</remarks> 
    Private Function InvokeProperty(ByVal Obj As Object, ByVal PropertyName As String, ByVal PropertyValue As String) As Object 
     Dim Params(0) As String 
     Params(0) = PropertyValue 
     Return Obj.GetType().InvokeMember(PropertyName, Reflection.BindingFlags.SetProperty, Nothing, Obj, Params) 
    End Function 

Répondre

0

Je pense que vous êtes sur la bonne voie en vous doutant du downcasting. Que retourne Obj.GetType()? Le débogueur montrera que le paramètre est un CompareValidator, car il est, mais cette information peut ne pas être disponible à la méthode si vous l'avez downcast avant de la transmettre.

+0

Malheureusement, ce n'est pas le downcasting. Je l'ai essayé avec un validateur de comparaison réel et toujours obtenir la même erreur. Mais j'ai remarqué que les propriétés auxquelles il échoue sont aussi des énumérations. Peut-être que le message d'erreur est juste trompeur? ou il ne peut pas trouver Type en tant que propriété de chaîne? Donc, si invoke member ne peut fournir que des paramètres de chaîne, comment transmettre une énumération ou son équivalent numérique? Cette question pourrait devoir être republiée avec cela comme titre si google ne peut pas m'aider. – Frank

0

Merci, je l'ai maintenant. Mon approche était trop simpliste. Cela fonctionnait uniquement avec les propriétés de chaîne. J'obtenais l'erreur car InvokeMember recherchait «propriété publique Type en tant que chaîne» au lieu de «Type de propriété publique en tant que ValidationDataType». Je l'ai trouvé en utilisant le code suivant:

  Dim info As System.Reflection.PropertyInfo = Obj.GetType().GetProperty("Type") 
      Dim EnumType As Type = info.PropertyType 
      info.SetValue(Obj, [Enum].Parse(EnumType, ValidationDataType.Date), Nothing) 

Alors vous vivez et vous apprenez. J'espère que cela aidera peut-être quelqu'un d'autre aussi.

+0

Content de vous l'avoir eu :) – Don