C# Winforms和ASP.NET中的重构

C# Winforms和ASP.NET中的重构,c#,refactoring,C#,Refactoring,当我为Winforms和ASP.NET创建用户控件时,我发现自己在为窗体上的每个属性反复编写同一段代码,如下所示: private string _url; public string Url { get { return _url; } set { if (_url == value) return; _url = value; OnUrlChange(EventArgs.Empty); } } public event EventHa

当我为Winforms和ASP.NET创建用户控件时,我发现自己在为窗体上的每个属性反复编写同一段代码,如下所示:

private string _url;

public string Url
{
  get { return _url; }
  set
  {
    if (_url == value)
      return;

    _url = value;
    OnUrlChange(EventArgs.Empty);
  }
}

public event EventHandler UrlChanged;

protected virtual void OnUrlChange(EventArgs e)
{
  //Maybe add some extra logic here

  if(UrlChanged != null)
    UrlChanged(this, e);
}
有时会有奇怪的变化。也许我会编写自己的类,该类派生自
EventArgs
,并使用它

这似乎是一项共同的任务。也许我做错了,有更简单的方法来写这些东西吗?但是如果没有,那么在给定属性名
Url
的情况下,是否可以设置任何自定义重构工具来填充此代码

在给定属性名
Url
的情况下,是否可以设置任何自定义重构工具来填充此代码


您可以创建自己的模式来实现这一点。

您的模式非常常见,而且是实现这一点的最佳方式

也就是说,你绝对应该使用。它们允许为这样的代码轻松创建模板。您可以定义自己的占位符,当插入代码段时,VisualStudio会高亮显示占位符,并允许您通过制表符查看它们


我还推荐这个插件,它将使代码片段的创建变得更加容易和有趣。它还有助于找出您不知道存在的代码段功能。

这取决于您的体系结构,但如果您试图减少冗余,您可以创建一个包含任何共享属性和方法的基类,并让您的控件继承自它。

几个月前我就考虑过这个问题,并尝试过使用它:

    public event PropertyChangedEventHandler PropertyChanged;

    int _MyProperty;
    public int MyProperty
    {
        get { return _MyProperty; }
        set { ChangeIfUnequal(ref _MyProperty, value, "MyProperty"); }
    }

    int _AnotherProperty;
    public int AnotherProperty
    {
        get { return _AnotherProperty; }
        set { ChangeIfUnequal(ref _AnotherProperty, value); }
    }


    void ChangeIfUnequal<T>(ref T Val, T NewValue, string Identifier="")
    {
        if (!Val.Equals(NewValue))
        {
            Val = NewValue;
            var temp = PropertyChanged;
            if(temp != null)
                temp(this, new PropertyChangedEventArgs(Identifier));
        }
    }
public event propertychangedventhandler PropertyChanged;
int_MyProperty;
公共财产
{
获取{return\u MyProperty;}
集合{changeifInquality(ref _MyProperty,value,“MyProperty”);}
}
国际其他财产;
公共财产
{
获取{return\u其他属性;}
集合{changeifEnquality(ref _其他属性,值);}
}
void changeifEnqualize(ref T Val,T NewValue,字符串标识符=“”)
{
如果(!Val.Equals(NewValue))
{
Val=新值;
var temp=已更改的属性;
如果(温度!=null)
临时(这是新属性ChangedEventArgs(标识符));
}
}

但我从未在生产中运行过它,也没有花足够的时间去思考这是一个边际改进还是不必要的复杂化。毫无疑问,它并不像在每个属性中显式设置它那样灵活,因为这只会增加!等于。我想要么接受要么放弃

哦,我说!我不知道你可以自己编写代码片段。一直认为它们是微软的标准产品。每天都是上学的日子。@ConnellWatkins-visualstudio具有难以置信的可扩展性。这是我希望能够重复的模式,而不是实际的方法和属性。例如,我希望能够在其他地方做同样的事情,但是使用
Text
属性、
\u Text
字段、
TextChanged
事件和
OnTextChanged
方法。这是一个很好的答案,因为它非常接近OP所寻找的内容。然而,它也揭示了一个事实,即解决方案并不比问题好多少+1,但我接受了snippet方法,因为我最终就是这样做的。当然这是最有趣的答案。如果我能+10,我会:我不是.NET的人,也不确定我是否理解你,但我猜你的意图是在每次更新属性(例如调用set*方法)时通知另一个元素(可能是UI上的某个元素)。您认为这是一项非常常见的任务是对的,与创建父类或代码段生成器相比,我想看看API中已经实现了哪些行为,因为我确信它是。我会这么想的。NET framework中的大多数控件都内置了此代码或非常类似的代码。虽然有一些不同的实现会使行为有所不同,但如果将其进一步简化,就会失去一些灵活性。不幸的是,我曾经反编译过的所有.NET库代码都遵循长期模式,而且我非常确定没有任何内置解决方案@user617090:您是否使用具有此功能的平台?看起来怎么样?