2010-02-03 58 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