多个属性的公共代码

Common code for multiple properties

我们有一个辅助函数,可以从字符串中删除 html 标签,我们希望将这些标签应用于 类 的一些属性,例如姓名、名字、评论等。

为此,我现在正在做的是删除 html 标签,然后再像这样 属性 赋值

public string Name
{
    get { return _dalObj.Name; }
    set { _dalObj.Name = Helper.StripHTML(value); }
}

这工作正常!

但我正在寻找更好的集中方式来执行此操作,而不是将其应用于所有属性 setter。

所以我会在某个地方集中编写一次这段代码,然后标记属性(可能通过自定义数据注释或在某处注册它们或使用反射),这些属性将被自动选择,这段代码将应用于有 setter.

有什么方法可以实现这个或者我做的是对的吗?

正如评论中所提到的,它看起来像是一种代码味道,属性 的值与设置的值不同。

我建议按原样存储值,并在抽象基础 class 中实现一个 Sanitize() 方法,该方法将遍历所有这些属性并去除 html ,它可以通过反射来探索要清理的属性(例如具有某些属性的属性),或者它可以是由每个 class 实现的抽象方法来清理适当的属性。

我觉得你需要做一些事情 Aspect Oriented Programming

可以与 C# 一起使用的一个 AOP 工具是 PostSharp。您可以使用它来创建一个方面,例如HtmlStripperAspect,然后将其应用于您的属性。

例如,你会有这样的东西:

[HtmlStripperAspect]
public string Name
{
    get { return _dalObj.Name; }
    set { _dalObj.Name = value; }
}

其中 HtmlStripperAspect 是您在 PostSharp 的帮助下创建的集中式 class,在这样的 class 中您调用您的 Helper.StripHTML 方法。

如果您不想用 HtmlStripperAspect 修饰所有属性,您也可以在 class、命名空间或程序集级别应用方面。

查看 PostSharp 文档,了解具体是如何完成的。

PostSharp 是一个编译时 AOP 工具,它在编译时将 IL 代码注入到您的程序集中。如果你不喜欢这个,还有 运行-time AOP 工具比如 Dynamic Proxy.

您始终可以将其编码为类型的一部分!

_dalObj 可能是某种声明名称的类型:

private NoHtmlString _name = ""

class NoHtmlString 看起来像这样:

public class NoHtmlString
{
    private readonly string _value;

    private NoHtmlString(string str)
    {
        _value = str;
    }

    public static implicit operator string(NoHtmlString noHtmlString)
    {
        return noHtmlString._value;
    }

    public static implicit operator NoHtmlString(string someString)
    {
        return new NoHtmlString(StringHelpers.StripHtml(someString));
    }
}

这样您的外部访问层就可以执行以下操作:

public string Name
{
    get { return _dalObj.Name; }
    set { _dalObj.Name = value; }
}

您可以将某些内容隐式用作字符串,但保证它始终会被删除 HTML.

正如其他人所提到的,这也可以使用面向方面的编程来实现。