我的webforms项目有一个html助手类。到目前为止,它可以返回字符串来创建标签和只读字段。
Public Shared Function DisplayFor(value As String, Optional attributes As String = "") As String
Return [String].Format("<span class='uneditable-input {0}'>{1}</span>", GetSStyle(attributes), value)
End Function
现在我想创建一些可以接受传递实体属性的重载,以便它可以在内部检查数据类型(来自属性)并显示格式化的内容,例如。就像MVC一样。
唯一的问题是我不知道如何将类属性作为函数参数传递。
答案 0 :(得分:1)
您可以将属性作为Expression(Of Func(Of MyModel, String))
传递,然后通过该属性接收您可以分析和评估的方法中的表达式:
Public Shared Function DisplayFor(Of TModel, TValue)(model As TModel, expr As Expression(Of Func(Of TModel, TValue))) As String
' Retrieve the value dynamically
Dim compExpr = expr.Compile()
Dim value = compExpr.DynamicInvoke(model)
Dim retVal As String
If value Is Nothing Then
retVal = String.Empty
Else
retVal = value.ToString()
End If
' Analyze expression body
Dim memberAccExpr = DirectCast(expr.Body,
System.Linq.Expressions.MemberAccessExpression)
Dim attr = memberAccExpr.Member.GetCustomAttributes(typeof(MyDisplayAttribute), false).Cast(Of MyDisplayAttribute)().FirstOrDefault();
Return retVal
End Function
调用这样的方法:
DisplayFor(myModelVar, Function(m) m.MyProperty)
我希望这个示例能够为您提供有关如何处理此问题的大致概述。请注意,特别是表达体的分析被简化了。在现实世界的代码中,会有各种检查以确保表达式符合您的期望。