我有一个用于我的网络表单项目的 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一样。
唯一的问题是我不知道如何将类属性作为函数参数传递。
可以将属性作为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)
我希望此示例能为您提供有关如何处理此问题的粗略概述。请注意,特别是简化了对表达式正文的分析。在实际代码中,将进行各种检查以确保表达式符合您的期望。