C# Winforms和ASP.NET中的重构
当我为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
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:您是否使用具有此功能的平台?看起来怎么样?