C# 将字符串类型的扩展方法写入为(String.extension而不是“String.extension”)
为字符串编写扩展很容易,但问题是,如果像这样编写,它总是显示为C# 将字符串类型的扩展方法写入为(String.extension而不是“String.extension”),c#,C#,为字符串编写扩展很容易,但问题是,如果像这样编写,它总是显示为“MyString”.ExtensionMethod(): public static class Extensions{ public static String ExtensionMethod(this String input){ return "Something"; } 现在,如果我们需要为字符串类型编写一个扩展方法,它可以像这样使用: var value = String.MyExtension
“MyString”.ExtensionMethod()
:
public static class Extensions{
public static String ExtensionMethod(this String input){
return "Something";
}
现在,如果我们需要为字符串类型编写一个扩展方法,它可以像这样使用:
var value = String.MyExtensionMethod();
与字符串类似。为空
什么是正确的方法来定义我们想要的编译器?这将需要添加不可能的
静态扩展方法
SO中有几个答案涵盖了这个主题,以及如何克服它
请参阅示例。这需要添加不可能的静态扩展方法
SO中有几个答案涵盖了这个主题,以及如何克服它
请参见示例。是公共静态字段
您不能创建这样的扩展方法
扩展方法仅支持实例级公共方法。是公共静态字段
您不能创建这样的扩展方法
扩展方法只支持实例级公共方法。这不可能有静态扩展方法。此外,您不能将静态成员添加到您不拥有的任何类中,而且只能在同一assemlby中使用partial。我所说的“拥有”是指您拥有源代码而不使用dll
在我的例子中,我有一个包含自定义静态方法的StringExtensions
类。这是不可能有静态扩展方法的。此外,您不能将静态成员添加到您不拥有的任何类中,而且只能在同一assemlby中使用partial。我所说的“拥有”是指您拥有源代码而不使用dll
在我的例子中,我有一个StringExtensions
类,其中包含自定义静态方法。扩展方法只能用于类的实例。编译器只需在所有公共静态类中搜索所有公共静态方法,其中type前面带有关键字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是只读字段,不是方法
但是,您可以做的是创建自己的类来处理string,并在其中添加方法:
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";
}
}
虽然它不是您想要的扩展方法只能用于类的实例。编译器只需在所有公共静态类中搜索所有公共静态方法,其中type前面带有关键字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是只读字段,不是方法
但是,您可以做的是创建自己的类来处理string,并在其中添加方法:
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";
}
}
虽然这并不是你想要的出于好奇而问这个问题,但你不需要100%地回答这样的问题!出于好奇问这个问题,你不必百分百地这样问!