C# 多属性的通用代码

C# 多属性的通用代码,c#,properties,C#,Properties,我们有一个helper函数,用于从字符串中删除html标记,我们希望将这些标记应用于类的一些属性,如Name、Firstname、Comments等 因此,我现在要做的是在像这样为属性赋值之前删除html标记 public string Name { get { return _dalObj.Name; } set { _dalObj.Name = Helper.StripHTML(value); } } 这很好用 但我正在寻找更好的集中化方法来实现这一点,而不是将其应用于所有

我们有一个helper函数,用于从字符串中删除html标记,我们希望将这些标记应用于类的一些属性,如Name、Firstname、Comments等

因此,我现在要做的是在像这样为属性赋值之前删除html标记

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

但我正在寻找更好的集中化方法来实现这一点,而不是将其应用于所有的属性设置器

因此,我将在集中的某个地方编写一次代码,然后通过自定义数据注释或在某个地方注册属性或使用反射来标记属性,这些属性将自动拾取,并且此代码将应用于setter


有没有办法做到这一点,或者我所做的是正确的

如注释中所述,该属性的值与设置的值不同,这看起来像是代码味道


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

在我看来,您需要做一些工作

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

例如,您将有如下内容:

[HtmlStripperAspect]
public string Name
{
    get { return _dalObj.Name; }
    set { _dalObj.Name = value; }
}
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));
    }
}
其中,HtmlStripperSpect是在PostSharp的帮助下创建的一个集中类,在该类中,您可以调用Helper.StripHTML方法

如果不想用HtmlStripperSpect装饰所有属性,也可以在类、命名空间或程序集级别应用该特性

请看一看有关如何准确完成此操作的文档


PostSharp是一个编译时AOP工具,它在编译时将IL代码注入程序集。如果您不喜欢这样,可以使用运行时AOP工具,例如。

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

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

私有NoHtmlString _名称=

NoHtmlString类的外观如下所示:

[HtmlStripperAspect]
public string Name
{
    get { return _dalObj.Name; }
    set { _dalObj.Name = value; }
}
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中删除


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

您是否使用任何框架和。。这是什么编程语言?@StephenKing-语言是C语言,我们不使用任何框架。但是,是的,我们有一个结构,我们所有的商业课程都遵循这个结构。我们的所有业务类都继承了一个抽象类。因此,如果我在抽象类中添加任何内容,它将应用于所有业务类的所有插入和更新;Assert.arequalx,foo.Name。。。打破这一点会导致代码混乱和错误。虽然它不能帮助你的特定问题考虑改变对方法的设置调用。你显然已经搜索到了现有的问题,所以考虑实际上在帖子中提供你的研究结果,这样就清楚了你已经考虑过的和拒绝的原因。@亚历山大尼科夫-你是对的!但改变对方法的集合调用将是一个巨大的变化: