为String编写扩展名很简单但问题是如果写成"MyString".ExtensionMethod()
,则总是显示为public static class Extensions{
public static String ExtensionMethod(this String input){
return "Something";
}
。
var value = String.MyExtensionMethod();
现在如果我们需要为String类型编写一个扩展方法,可以使用如下:
String.Empty
与spacelimit
类似。
向编译器定义我们想要的那种方式的正确方法是什么?
答案 0 :(得分:3)
答案 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";
}
}
虽然它不是你想要的