Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用扩展方法扩展字符串(C#3.0)?_C#_Extension Methods - Fatal编程技术网

使用扩展方法扩展字符串(C#3.0)?

使用扩展方法扩展字符串(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";

我知道我可以像这样扩展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";
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。我一直和你在一起,直到你创建了另一个字符串,我发现它非常混乱。但是你的答案是正确的:如果他想要一个静态方法,那么创建一个静态类是最容易的——他无论如何都必须使用一个类。简单的回答是“不,你不能那样做”,不幸的是,这并不完全正确。你可以做,我根本不推荐。当然,该项目的未来开发人员会因此而恨你。同意-即使代码实际上是可能的,这也是一个无用扩展方法的极好示例。