Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.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# 创建一个扩展方法以从不同的类重写_C#_Class_Overriding_Extension Methods_Tostring - Fatal编程技术网

C# 创建一个扩展方法以从不同的类重写

C# 创建一个扩展方法以从不同的类重写,c#,class,overriding,extension-methods,tostring,C#,Class,Overriding,Extension Methods,Tostring,我有不同的类,所有这些类都重写ToString()函数,它们都使用相同的逻辑 我现在要做的是为这些类中的一个调用一个静态方法,我想知道是否有可能创建一个扩展方法,该方法将从这些ToString()方法中调用 这就是我目前所拥有的 public class A { public override string ToString() { return Helper.myToString(this); } }

我有不同的类,所有这些类都重写
ToString()
函数,它们都使用相同的逻辑

我现在要做的是为这些类中的一个调用一个静态方法,我想知道是否有可能创建一个扩展方法,该方法将从这些
ToString()
方法中调用

这就是我目前所拥有的

 public class A
    {
        public override string ToString()
        {
            return Helper.myToString(this);
        }
    }

    public class B
    {
        public override string ToString()
        {
            return Helper.myToString(this);
        }
    }
myToString()

我创建了这样一个扩展方法

静态类扩展方法 { 公共静态字符串myStoString(此对象obj) { //做事 } }


但是我不知道怎么称呼它,或者它是否可能,你目前的方法还可以

扩展方法也是静态方法。运行时不会有任何区别,只是语法不同:

this.myToString()

而不是

Helper.myToString(此)


由于为
对象
编写扩展方法不是一个好选择(它将适用于所有情况),
Helper
类更可取。

您当前的方法还可以

扩展方法也是静态方法。运行时不会有任何区别,只是语法不同:

this.myToString()

而不是

Helper.myToString(此)


由于为
对象
编写扩展方法不是一个好的选择(它将适用于所有情况),
帮助程序
类更可取。

您可以创建一个如下的空接口:

public interface IPrintable { }
现在更改类声明,使它们实现该接口

public class A : IPrintable
{
  // ...
}

public class B : IPrintable
{
  // ...
}
因为接口是空的,所以不需要其他更改。然后您可以将扩展方法写入
IPrintable

public static class ExtensionMethods
{
    public static string MyToString(this IPrintable printable)
    {
        // do stuff
    }
}
并使用它:

// will work
var a = new A();
a.MyToString();

// will not work
var c = 10;
c.MyToString();

您可以创建一个空界面,如下所示:

public interface IPrintable { }
现在更改类声明,使它们实现该接口

public class A : IPrintable
{
  // ...
}

public class B : IPrintable
{
  // ...
}
因为接口是空的,所以不需要其他更改。然后您可以将扩展方法写入
IPrintable

public static class ExtensionMethods
{
    public static string MyToString(this IPrintable printable)
    {
        // do stuff
    }
}
并使用它:

// will work
var a = new A();
a.MyToString();

// will not work
var c = 10;
c.MyToString();

请记住,您需要在一个单独的静态类中声明扩展方法。请记住,您需要在一个单独的静态类中声明扩展方法。谢谢,但您能否解释一下,为对象编写扩展方法不是一个好的选择?在.NET中的每种类型都派生自
System.object
。在您的情况下,您将能够编写
123.myToString()
foo.myToString()
,因为
int
string
也是
对象。我怀疑您是否想要它。谢谢,但您能解释一下为object编写扩展方法的更多信息吗?在.NET中,每种类型都是从
System.object
派生的。在您的情况下,您将能够编写
123.myToString()
foo.myToString()
,因为
int
string
也是
对象。我怀疑你想要它。