多个属性的通用代码

时间:2015-09-01 14:42:24

标签: c# properties

我们有一个辅助函数来从字符串中删除html标签,我们想要应用于我们类的一些属性,如Name,Firstname,Comments等。

因此,我现在正在做的是在为此属性分配值之前删除html标记

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

这很好用!

但我正在寻找一些更好,更集中的方法,而不是将它应用于所有的属性设置器。

因此,我将集中编写此代码,然后标记属性(可以通过自定义数据注释或在某处注册或使用反射),这些属性将自动选取,此代码将应用于setter

有没有办法实现这一点或我正在做的是对的?

3 个答案:

答案 0 :(得分:0)

正如评论中所提到的,它看起来像一个代码气味,该属性将具有与设置的值不同的值。

我建议按原样存储值,并在抽象基类中实现一个Sanitize()方法,它将通过所有这些属性并去除html,它可以通过反射来完成,以便探索属性消毒(例如那些具有某些属性的消毒),或者它可以是每个类实施的抽象方法,以消毒适当的属性。

答案 1 :(得分:0)

在我看来,你需要做一些Aspect Oriented Programming

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

例如,你会有这样的事情:

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

其中HtmlStripperAspect是您在PostSharp的帮助下创建的集中式类,在此类中您可以调用Helper.StripHTML方法。

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

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

PostSharp是一个编译时AOP工具,它在编译时将IL代码注入到程序集中。如果您不喜欢这样,那么有Dynamic Proxy等运行时AOP工具。

答案 2 :(得分:0)

您可以随时将其编码为类型的一部分!

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

private NoHtmlString _name = ""

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。

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