2010-02-03 82 views
2

我創建.NET驗證動態和通過我調用屬性和值來調用該屬性,並將該值的方法。.NET基校驗器和反射

這是工作的大部分特性。但是,當我嘗試調用Operator方法或比較驗證程序的Type方法時,出現錯誤,指出無法找到該屬性。我正在使用的代碼如下。我知道它需要錯誤處理,但我仍處於早期開發階段,並希望看到它發生了什麼。通過調試器,我可以看到,作爲Obj提供的參數確實是一個CompareValidator,並且具有無法找到的屬性。我認爲它可能只是找到基本屬性,(我向調用方中的基礎驗證器向下轉發),但它在不是BaseValidator成員的ControlToCompare上工作。任何幫助,將不勝感激。

''' <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 

回答

0

我覺得你有懷疑的向下轉換在正確的道路上。 Obj.GetType()返回什麼?調試器將顯示該參數是一個CompareValidator,因爲它是,但這些信息可能不可用的方法,如果你已經通過它在之前向下轉換它。

+0

不幸的是,它不是倒轉。我用一個實際的比較驗證器嘗試了它,仍然得到相同的錯誤。但我確實注意到它失敗的屬性也是枚舉。也許錯誤信息只是誤導?或者它不能找到類型作爲一個字符串屬性?因此,如果invoke成員只能提供字符串參數,我該如何傳遞一個枚舉或其等價的數字? 如果谷歌不能幫助我,那麼這個問題可能必須作爲標題轉貼。 – Frank 2010-02-03 18:21:39

0

謝謝,我得到了現在。我的方法太簡單了。它只處理字符串屬性。我得到的錯誤,因爲InvokeMember尋找「公共屬性類型爲字符串」而不是「公共屬性類型爲ValidationDataType」。我發現使用下面的代碼:

  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) 

所以你活着,你學習。我希望這也能幫助其他人。

+0

很高興見到你了:) – Don 2010-02-03 19:21:02