我们有一个辅助函数来从字符串中删除html标签,我们想要应用于我们类的一些属性,如Name,Firstname,Comments等。
因此,我现在正在做的是在为此属性分配值之前删除html标记
public string Name
{
get { return _dalObj.Name; }
set { _dalObj.Name = Helper.StripHTML(value); }
}
这很好用!
但我正在寻找一些更好,更集中的方法,而不是将它应用于所有的属性设置器。
因此,我将集中编写此代码,然后标记属性(可以通过自定义数据注释或在某处注册或使用反射),这些属性将自动选取,此代码将应用于setter
有没有办法实现这一点或我正在做的是对的?
答案 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。
正如其他人所提到的,这也可以通过面向方面编程来实现。