将String类型的扩展方法编写为(String.Extension NOT“String”.Extension)

时间:2015-09-29 06:16:58

标签: c#

为String编写扩展名很简单但问题是如果写成"MyString".ExtensionMethod(),则总是显示为public static class Extensions{ public static String ExtensionMethod(this String input){ return "Something"; }

 var value = String.MyExtensionMethod();

现在如果我们需要为String类型编写一个扩展方法,可以使用如下:

String.Empty

spacelimit类似。

向编译器定义我们想要的那种方式的正确方法是什么?

4 个答案:

答案 0 :(得分:3)

String.Empty是一个公共静态字段。

您不能将此类内容创建为扩展方法。

扩展方法仅支持实例级公共方法。

答案 1 :(得分:1)

这需要添加static扩展方法的可能性,这是不可能的。

SO中有几个答案涵盖了这个主题,以及如何克服它。

例如,请参阅Can I add extension methods to an existing static class?

答案 2 :(得分:0)

这是不可能有静态扩展方法。此外,您不能将静态成员添加到您不拥有的任何类中,也可以在同一个assemlby中使用partial。通过拥有我的意思是你有源,不要使用DLL。

在我的例子中,我有一个包含自定义静态方法的StringExtensions类。

答案 3 :(得分:0)

扩展方法只能与类的实例一起使用。编译器只搜索所有公共静态类中的所有公共静态方法,其中类型前面有关键字this和'附加'它们的类型可以将它们称为实例方法,但它只是方便,实际上这些方法与其他任何静态方法都是一样的。

所以单词this不能与static类一起使用,因为它指的是某个类的实例,并且没有static instance这样的东西。

public static class Helper
{
    public static bool MyExtMethod(this MyClass instance)
    {
        ...
    }
}

编译器找到此方法并将其附加到MyClass,执行以下操作:

class MyClass
{
   ...
    public bool MyExtMethod()
    {
       return Helper.MyExtMethod(this);
    }
} 

所以它基本上允许我们在MyClass上调用静态方法,而不是直接在Helper上执行。

String.Empty是一个只读字段而不是方法。

然而,你可以做的是创建自己的类,使用字符串并在那里添加你的方法:

class MyString
{
   private readonly string value;
   public string Value { get { return value; } }

   public MyString(string s) { this.value = s; }   

   public static implicit operator MyString(string s)
   {
      MyString ms = new MyString(s);
      return ms;
   }

   public static implicit operator string(MyString s)
   {
      return s.Value;
   }

   public static String ExtensionMethod1(String input){
      return "Something1";
   }

   public static String ExtensionMethod2(String input){
      return "Something1";
   }
}

虽然它不是你想要的