2016-12-14 16 views
0

我有一个名为“person”的类,它具有属性。属性名称的几个例子是...将类属性名传递给子例程

person.name 
person.surname 
person.firstname 

我想这个属性名传递给一个子程序...不知道如果我甚至可以做到这一点。我想这样做,因为我将拥有100个属性,而且我不想要100个IF语句。

这就是我目前正在做的,我想用一种方法清理它。图片100如果然后像这样的语句,检查一个不同的属性名称。

If propname= "FirstName" Then 
     If GetSet.caseexact = True Then 
       If GetSet.casesensativity = True Then 
        View.Filter = Function(m) DirectCast(m, person).FirstName = s 
       Else 
        View.Filter = Function(m) DirectCast(m, person).FirstName.ToLower = s.ToLower 
       End If 
     Else 
       If GetSet.casesensativity = True Then 
        View.Filter = Function(m) DirectCast(m, person).FirstName.Contains(s) 
       Else 
        View.Filter = Function(m) DirectCast(m, person).FirstName.ToLower.Contains(s.ToLower) 
       End If 
     End If 
End If 

我试图用一种方法清理它,所以我可以只传递属性名称到一个方法...如果这是可能的。

Public Sub properties(filterstring As String, getProp as person) 
    View.Filter = Function(m) DirectCast(m, person).getProp = filterstring 
End Sub 

任何关于如何使这项工作或最佳方法的指导?

+0

你应该说明* *什么你正在尝试做的 - 这* *怎么可能未启用的方式,因为'getProp'不能是一个可变参数和一些别的属性。你可以使用反射,但我怀疑有一个更简单的方法。 GetSet是什么? – Plutonix

回答

1

反射会奏效。如果属性公共,虽然,那么你可以简单地使用CallByName()代码:

Dim p As New Person 
    p.FirstName = "Mike" 

    Dim s As String = "Bob" 
    Dim propname As String = "FirstName" 
    View.Filter = (CallByName(p, propname, CallType.Get) = s) 
    ' <or> 
    View.Filter = (CallByName(p, propname, CallType.Get).ToString.ToLower = s)