使用扩展方法扩展字符串(C#3.0)?
我知道我可以像这样扩展string类:使用扩展方法扩展字符串(C#3.0)?,c#,extension-methods,C#,Extension Methods,我知道我可以像这样扩展string类: public static class EMClass { public static int ToInt32Ext(this string s) { return Int32.Parse(s); } public static int ToInt32Static(string s) { return Int32.Parse(s); } } 然后像这样使用它: string x = "12";
public static class EMClass
{
public static int ToInt32Ext(this string s)
{
return Int32.Parse(s);
}
public static int ToInt32Static(string s)
{
return Int32.Parse(s);
}
}
然后像这样使用它:
string x = "12";
x.ToInt32Ext()
int x = string.ToInt32("15");
但我如何才能做到这样使用它:
string x = "12";
x.ToInt32Ext()
int x = string.ToInt32("15");
我认为你不能用“静态”的扩展方法 伙计,你对Int32.Parse()有什么问题吗?我在我们的项目中所做的工作叫做字符串,我把所有扩展方法都放在这里。这样,您就有了一些在视觉上看起来类似于字符串的东西 在您的示例中,您也可以这样调用扩展方法(并非所有人都喜欢,但我自己使用它取决于我正在处理的代码):
扩展方法只应用于类的实例,而不是类本身。不能使用使用扩展的类方法扩展类。请注意,您应该能够轻松地使用扩展方法,只需使用
var fifteen = "15".ToInt32Ext();
你真的不能这么做。。。您将得到的最接近的结果是:
public static class Ext
{
public static class String
{
public static int ToInt32(string val)
{
return Int32.Parse(val);
}
}
}
//Then call:
Ext.String.ToInt32("32");
令我惊讶的是,编译器甚至允许您将类命名为“String”
只是为了娱乐,我想到了另一种有趣的方式,尽管我永远不会推荐这种方式。加:
using String = NameSpace1.Ext.String;
//Then you can access it as:
String.ToInt32("32"); //Yipes
就我个人而言,对于已经是一个简短的一行程序的方法调用,我认为扩展方法包装没有多大用处。另一方面,包装Int32.TryParse模式以返回可为空的int非常方便:
public static int? ToInt32(this string input)
{
if (String.IsNullOrEmpty(input))
return null;
int parsed;
if (Int32.TryParse(input, out parsed))
return parsed;
return null;
}
这允许您分析可能不存在或可能不包含整数的值,并在一行代码中提供默认值:
int id = Request.QueryString["id"].ToInt32() ?? 0;
请记住,方法签名中的第一个参数(this T argt)表示类型,而不是类型的实例@Claus这是错误的-第一个参数包含调用扩展方法的实例(如果在null上调用扩展方法,则为null)。没错。此功能已多次向Microsoft(Microsoft Connect)建议,但在不久的将来不会添加。我真的非常想要静态扩展方法。为什么会感到意外?您可以有许多具有相同名称的类,只是不在同一命名空间中;)你差点得到我的+1。我一直和你在一起,直到你创建了另一个字符串,我发现它非常混乱。但是你的答案是正确的:如果他想要一个静态方法,那么创建一个静态类是最容易的——他无论如何都必须使用一个类。简单的回答是“不,你不能那样做”,不幸的是,这并不完全正确。你可以做,我根本不推荐。当然,该项目的未来开发人员会因此而恨你。同意-即使代码实际上是可能的,这也是一个无用扩展方法的极好示例。