【问题标题】:.NET 4, Can I use attributes or some other OOP feature to simplify this code?.NET 4,我可以使用属性或其他一些 OOP 功能来简化此代码吗?
【发布时间】:2011-05-13 23:21:37
【问题描述】:

我有一个多语言系统,而且我在每个类中到处都有我称之为“包装器属性”的东西,例如:

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 实体,其中 New() 签名已经由 DBML 生成。我目前的技术使用静态函数。

2) “EntityID”是实时信息,不是编译时信息。

谁能建议我如何收拾这个烂摊子?

【问题讨论】:

    标签: .net asp.net oop


    【解决方案1】:

    您可以使用 lamdas 代替字符串:
    Retrieving Property name from lambda expression
    这样你至少可以得到编译时检查。

    您可以使用 stackwalking 来推断调用方法,从而推断关联的属性。因此,您根本不需要手动引用该属性。但我不喜欢这种方法。

    您可以使用PostSharp 之类的 IL 重写器来执行 aspect-orientated programming。然后你可以用一个属性替换手动代码。 PostSharp 然后将您的样板代码添加到具有该属性的属性中。

    但我不确定您的本地化整体设计是否良好。我从来没有见过这样做的。而且我不明白 setter 是干什么用的。

    【讨论】:

    • 抱歉很晚才接受。我想在尝试解决我的问题时,了解 MVC 的 TryUpdateModel 的工作原理会有所帮助,这似乎也以某种方式遍历属性并检查它们的属性等。将在 MVC 源代码中四处寻找。
    猜你喜欢
    • 1970-01-01
    • 2022-12-10
    • 2011-05-27
    • 2018-02-08
    • 2013-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多