让我们列出你发布优秀和最喜欢的扩展方法的答案.
要求是必须发布完整代码并提供示例和如何使用它的说明.
基于对该主题的高度关注,我在Codeplex上设置了一个名为extensionoverflow的开源项目.
请标记您的答案并接受将代码放入Codeplex项目中.
请发布完整的源代码而不是链接.
Codeplex新闻:
24.08.2010 Codeplex页面现在在这里:http://extensionoverflow.codeplex.com/
11.11.2008 XmlSerialize/XmlDeserialize现在已实现并且已经过单元测试.
11.11.2008仍有更多开发人员的空间.;-) 现在加入!
11.11.2008第三个贡献者加入了ExtensionOverflow,欢迎来到BKristensen
11.11.2008 FormatWith现在已实现且已经过单元测试.
09.11.2008第二个贡献者加入了ExtensionOverflow.欢迎来到chakrit.
09.11.2008我们需要更多开发人员.;-)
我想要做的是这样的:我有枚举标记值的枚举.
public static class EnumExtension
{
public static bool IsSet<T>( this T input, T matchTo )
where T:enum //the constraint I want that doesn't exist in C#3
{
return (input & matchTo) != 0;
}
}
Run Code Online (Sandbox Code Playgroud)
那么我可以这样做:
MyEnum tester = MyEnum.FlagA | MyEnum.FlagB
if( tester.IsSet( MyEnum.FlagA ) )
//act on flag a
Run Code Online (Sandbox Code Playgroud)
不幸的是,C#的通用,其中约束没有枚举限制,只有类和结构.C#不会将枚举视为结构(即使它们是值类型),因此我无法像这样添加扩展类型.
有没有人知道解决方法?
C#6更新
// C#1-5
propertyValue1 = myObject != null ? myObject.StringProperty : null;
// C#6
propertyValue1 = myObject?.StringProperty;
Run Code Online (Sandbox Code Playgroud)
下面的问题仍适用于旧版本,但如果使用new ?.运算符开发新应用程序则更好.
原始问题:
我经常想要访问可能为null的对象的属性:
string propertyValue1 = null;
if( myObject1 != null )
propertyValue1 = myObject1.StringProperty;
int propertyValue2 = 0;
if( myObject2 != null )
propertyValue2 = myObject2.IntProperty;
Run Code Online (Sandbox Code Playgroud)
等等...
我经常使用它,因此我有一个代码片段.
如果符合以下条件,您可以在某种程度上缩短此内容:
propertyValue1 = myObject != null ? myObject.StringProperty : null;
Run Code Online (Sandbox Code Playgroud)
然而,这有点笨拙,特别是如果设置大量属性或多个级别可以为null,例如:
propertyValue1 = myObject != null ?
(myObject.ObjectProp != null ? myObject.ObjectProp.StringProperty) : null : null;
Run Code Online (Sandbox Code Playgroud)
我真正想要的是 …
MVVM的新手,请原谅我的无知.
我认为我正确使用它,但我发现我的ViewModel有太多这些:
RaisePropertyChanged("SomeProperty")
Run Code Online (Sandbox Code Playgroud)
每次我设置一个房产,我都要提高那个该死的房产.
我想念我可以去的日子:
public int SomeInteger { get; private set;}
Run Code Online (Sandbox Code Playgroud)
这些天我必须在任何地方坚持"RaisePropertyChanged"或我的UI不反映变化:(
我做错了还是其他人对过多的魔法字符串和旧学校的业主制定者感到恼火?
我应该使用依赖属性吗?(我怀疑这会对代码膨胀有帮助)
尽管存在这些问题,我仍然认为MVVM是要走的路,所以我想这就是问题.
我想为.NET String类编写扩展方法.我希望它是Split方法的一个特殊的方法 - 在分隔符之前使用转义字符时,它采用转义字符来防止拆分字符串.
写这个的最好方法是什么?我很好奇最好的非正则表达式来接近它.
像签名一样的东西......
public static string[] Split(this string input, string separator, char escapeCharacter)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
更新: 因为它出现了一个评论,逃避......
在C#中转义非特殊字符时会出现错误 - CS1009:无法识别的转义序列.
在IE JScript中,转义转义字符.除非你尝试\ u然后你得到一个"预期的十六进制数字"错误.我测试了Firefox,它有相同的行为.
我希望这种方法非常宽容并遵循JavaScript模型.如果你在非分隔符上转义,它应该"善意"删除转义字符.
我正在将Java代码转换为C#.Java中的StringBuilder类似乎有比C#更多的方法.我对(比如说)Java功能很感兴趣
sb.indexOf(s);
sb.charAt(i);
sb.deleteCharAt(i);
Run Code Online (Sandbox Code Playgroud)
这似乎在C#中缺失.
我想前两个可以建模
sb.ToString().IndexOf(s);
sb.ToString().CharAt(i);
Run Code Online (Sandbox Code Playgroud)
但第三个是否会根据某人的内容而非实际内容进行操作?
是否有一种将此功能添加到所有缺失方法的常用方法?
我有一个有几十个属性需要引发属性更改事件的类,目前我的代码看起来像
public class Ethernet : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private string timeStamp;
public string TimeStamp
{
get { return timeStamp; }
set
{
timeStamp = value;
if(PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("TimeStamp"));
}
}
}
Run Code Online (Sandbox Code Playgroud)
在C#中编写这种代码是否有更短的方法,我正在为每个属性进行过多的复制/粘贴操作,我觉得必须有更好的方法.