C# 扩展类以符合接口?

C# 扩展类以符合接口?,c#,interface,extension-methods,C#,Interface,Extension Methods,我有一个界面: interface IFoo { int foo(int bar); } 我现在可以扩展现有的类以符合接口吗?说班级字符串。我知道我可以在字符串上定义foo()方法。但是有没有可能进一步告诉编译器可以将字符串转换为IFoo?您可以使用其他类,但不能使用System.String,因为它是密封的 如果希望对非密封类执行此操作,可以简单地从它派生,添加适当的构造函数,并将接口作为新类实现的对象 interface IFoo { int Size {get;} } //

我有一个界面:

interface IFoo {
  int foo(int bar);
}

我现在可以扩展现有的类以符合接口吗?说班级字符串。我知道我可以在字符串上定义foo()方法。但是有没有可能进一步告诉编译器可以将字符串转换为IFoo?

您可以使用其他类,但不能使用
System.String
,因为它是
密封的

如果希望对非密封类执行此操作,可以简单地从它派生,添加适当的构造函数,并将接口作为新类实现的对象

interface IFoo {
    int Size {get;}
}
// This class already does what you need, but does not implement
// your interface of interest
class OldClass {
    int Size {get;private set;}
    public OldClass(int size) { Size = size; }
}
// Derive from the existing class, and implement the interface
class NewClass : OldClass, IFoo {
    public NewCLass(int size) : base(size) {}
}

当类被密封时,通过组合将其表示为某个接口的唯一解决方案是:编写一个实现接口的包装类,给它一个密封类的实例,并编写“转发”到目标类的包装实例的方法实现。

我想这个问题可以重新表述为,“我可以使用扩展方法使密封类实现以前没有的接口吗?”正如其他人指出的,String类是密封的。但是,我认为您必须在其声明中命名类实现的接口:

public someClass : IFoo
{
    // code goes here
}
所以不能直接对字符串执行此操作,不仅因为它是密封的,而且因为您没有用于它的源代码

你所能做的最好的事情就是让你自己的类有一个字符串,并像字符串一样使用它。字符串执行您需要执行的任何操作都必须在其字符串成员上执行(从而使其公开),或者必须包装/重新实现所需的方法:

public class betterString : IFoo
{
   public String str {get; set;}

   public foo(int i)
   {
      // implement foo
   }
}
然后,在以后使用时:

public void someMethod(betterString better)
{
   better.foo(77);
   System.Console.WriteLine(better.str);
}

令人失望的是,这是公认的答案,因为这表明了子类化,而不是扩展类,这将使用类扩展。如果您使用的是扩展,那么您可以扩展System.String,但我不确定您是否可以使用扩展来符合接口。只需指出公认的答案是指子类化,而不是扩展类。您可能希望编辑问题以反映这一点,或者取消标记答案(如果您正在寻找答案)。我来到这里是因为我想扩展一些东西。我接受了这个答案,因为它是最好的。关于扩展类,答案是你不能。