多个属性的公共代码
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.
正如其他人所提到的,这也可以使用面向方面的编程来实现。
我们有一个辅助函数,可以从字符串中删除 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.
正如其他人所提到的,这也可以使用面向方面的编程来实现。