我有一个多语言系统,而且我在每个班级都有我称之为“包装器属性”的地方,例如:
Public Property Name(Optional ByVal ForceLanguageCode As String = Nothing) As String
Get
Return Translations.GetByCode(Me.EntityID, "name", ForceLanguageCode)
End Get
Set(ByVal value As String)
Translations.SetByCode(Me.EntityID, "name", value, ForceLanguageCode)
End Set
End Property
然后,我会为每个可翻译字段复制并粘贴该代码。
我希望能够以某种方式用一行代码替换一行代码。每次更改的唯一内容是字段的名称,例如“名称”,“标题”或“主题”等。这似乎有点浪费,我希望我的系统像以下一样易于使用对开发者来说是可能的。
我对属性进行了一些研究,但我不认为这是我的答案:
1)我不知道如何自动实例化对象,特别是因为这是扩展了一个LINQ实体,其中已经由DBML生成了New()签名。我目前的技术使用静态函数。
2)“EntityID”是实时信息,而不是编译时。
有人可以建议我如何清理这个烂摊子吗?
答案 0 :(得分:1)
您可以使用lamdas代替字符串:
Retrieving Property name from lambda expression
这样你至少可以进行编译时检查。
您可以使用stackwalking来推断调用方法,从而推断出相关属性。所以你根本不需要手动引用该属性。但我不喜欢这种做法。
您可以使用aspect-orientated programming等IL重写器执行PostSharp。然后,您可以使用属性替换手动代码。 PostSharp然后将您的样板代码添加到具有该属性的专业人员。
但我不确定你的本地化整体设计是否合适。我从来没有见过这样做过。我不明白二传手的用途。