代码之家  ›  专栏  ›  技术社区  ›  Prince Ashitaka

是否可以为抽象类编写扩展方法

  •  5
  • Prince Ashitaka  · 技术社区  · 14 年前

    在银色的灯光下,枚举.GetNames不见了。所以,我想扩展它,并在我的实用程序集。到那时,我已经进入了这个世界。

    2 回复  |  直到 14 年前
        1
  •  7
  •   Andras Zoltan    14 年前

    这里的问题不是不能向抽象类添加扩展方法(可以-可以向任何类型添加扩展方法)-而是不能向抽象类添加扩展方法 静态法 到具有扩展方法的类型。

    扩展方法是以实例方法的形式出现在C中的静态方法。但它们还是静止的。向类型中添加静态方法需要能够重新定义类型,只有在具有以下源代码时才能执行此操作:)

    如果你想使用这个方法,最好的办法是编写你自己的静态代码,看看你是否可以从反射镜中删除代码。

    但是,它完全有可能不存在,因为它在Silverlight中没有物理支持(我不知道-我还没有调查)

    编辑

    根据你的评论-我希望我在这里理解了你-我认为你想要做的是这样的事情(目标) object 为了证明这一点):

    public static class ExtraObjectStatics
    {
      public static void NewStaticMethod()
      {
    
      }
    }
    
    public class Test
    {
      public void foo()
      {
        //You can't do this - the static method doesn't reside in the type 'object'
        object.NewStaticMethod();
        //You can, of course, do this
        ExtraObjectStatics.NewStaticMethod();
      }
    }
    

    当然 您不能将新的静态方法注入到现有类型中,因为正如我在第二段中所说的,您必须能够重新编译底层类型;而这是无法避免的。

    Enum 并将其放置在新的命名空间中:

    namespace MySystem
    {
      public class Enum
      {
        public static string[] GetNames()
        {
          //don't actually know how you're going to implement it :)
        }
      }
    }
    

    现在-当你想用它的时候,你想要什么 不能 你要做的是:

    using System;
    using MySystem;
    
    namespace MyCode
    {
      public class TestClass
      {
        public static void Test()
        {
          Enum.GetNames(); //error: ambiguous between System and MySystem
        }
      }
    }
    

    因为在“System”和“MySystem”的最外层作用域中使用将导致编译器无法解析正确的 类型。

    可以 但是,您要做的是:

    using System;
    
    namespace MyCode
    {
      using MySystem; //move using to inside the namespace
      public class TestClass
      {
        public static void Test()
        {
          //will now work, and will target the 'MySystem.Enum.GetNames()'
          //method.
          Enum.GetNames();
        }
      }
    }
    

    只有 )将永远解决 因为那是最近的 using 范围方面的指令。

    所以,你可以认为这是压倒一切 枚举 using MySystem; 在里面。

    但是,它确实是这样的 现有的 System.Enum MySystem.Enum -意味着你失去了 系统.枚举 类型。

    您可以通过在 在周围键入 系统.枚举 系统.枚举 .

        2
  •  4
  •   user1228 user1228    14 年前
    public abstract class Foo
    {
      public abstract void Bar();
    }
    
    public static class FooExtensions
    {
      // most useless extension method evar
      public static void CallBar(this Foo me)
      {
        me.Bar();
      }
    }
    

    当然,没问题。