使用Entity Framework(EF6)和VB.Net反射,这两点我现在都不是很熟悉。
以下是我尝试实现目标的简要示例:
Dim user as New user()
user.full_name = "John Smith"
Dim str As String = "The user's name is **full_name**."
'For each p As Property In user.Properties
' str = str.Replace("**" + p.Name + "**", p.Value)
'Next
输出:用户的名字是John Smith。
然而,问题是object
是匿名类型。我希望能够传入我的任何实体类并动态替换属性出现。
我已经尝试了很多并且在这里阅读了大量的问题,但我仍然遇到了麻烦 - 很明显,我不能正确理解反思爱好。
我将在下面提供我的代码,以及我引用的任何内容。如果有人能够把我推向正确的方向,我会感激不尽。感谢。
根据GSerg的评论更新:
Public Function MailMerge(htmlString As String, obj As Object) As String
Dim keyNames As New List(Of String)
Dim dictionaryData As New Dictionary(Of String, String)()
For Each p As System.Reflection.PropertyInfo In obj.GetType().GetProperties()
If p.CanRead AndAlso p.GetIndexParameters().Length = 0 Then
Dim columnName As String = p.Name
'FAILS HERE - p.Name is "Item" at the failing iteration
Dim columnValue = p.GetValue(obj, Nothing)
dictionaryData.Add(columnName, columnValue)
End If
Next
For Each key In dictionaryData.Keys
htmlString = htmlString.Replace("**" + key + "**", dictionaryData(key))
Next
Return htmlString
End Function
我只获得Capacity
和Count
作为属性,但是如果给出user
类型的对象(来自上方),我希望{ {1}}。
编辑:原来这个功能也需要处理列表,这显然是我上面提到的问题的根本原因。我要再调整一下,如果我无法弄清楚,我会更新我的问题。
参考文献: