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

时间:2009-08-18 18:05:40

标签: c# extension-methods

我知道我可以像这样扩展字符串类:

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");

6 个答案:

答案 0 :(得分:12)

我认为你不能做“静态”扩展方法。

答案 1 :(得分:3)

老兄,你对Int32.Parse()有什么问题吗?

答案 2 :(得分:3)

我在工作项目中所做的是created a class,称为Strings,这是我放置所有扩展方法的地方。这样你就会看到类似于字符串的东西。

你可以像你这样调用你的例子中的扩展方法(并非所有人都喜欢这样,但我自己使用它取决于我正在处理的代码):

int x = "15".ToInt32();

答案 3 :(得分:1)

扩展方法仅适用于类的实例,而不适用于类本身。您不能使用扩展名使用类方法扩展类。请注意,只需使用扩展方法,您就可以轻松地执行所需的操作。

var fifteen = "15".ToInt32Ext();

答案 4 :(得分:1)

你真的不能这样做......你最接近的就是:

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

答案 5 :(得分:0)

就个人而言,我没有看到很多用于扩展方法包装器的方法调用已经是一个简短的单行程序。另一方面,包装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;