静态上下文和派生类型中的C#扩展方法

时间:2011-01-04 11:06:00

标签: c# methods

C#中的现有类型需要使用一些新方法进行扩展,以便满足以下条件:

  1. 扩展方法应该在另一个程序集中抵制
  2. 它们应该显示为原始类型的静态方法
  3. 它们也应该对原始类型的派生类的实现者可见
  4. 示例,程序集Orig.dll:

    public class Orig {
        public static void Method1() { }
    }
    

    Assembly Extend.dll:

    // method, which extends Orig in a static context is needed ...  
    // ?? 
    // public static void Method2() { } 
    

    用法示例(理想):

    public class Usage : Orig {
       Method1();  // naturally working
       Method2();  // <- this is needed
    }
    public void SomeFunc() {
       Orig.Method2();  // <- this should ideally work also 
    }    
    

    自然而然地想到的第一个尝试是使用C#3.0的扩展方法。但与我想要的不同,这些(我认为)仅适用于被扩展类型的实例。在派生类的上下文中,这可以像下面这样来实现:

    public class Usage : Orig {
       Method1();  // naturally working
       this.Method2();  // working with C# 3.0 extension methods, but clumsy syntax
    }
    

    第一个要求(来自装配外部的静态上下文)似乎根本不是完全可填充的?那么还有另一种潜在的方法吗?

    @Edit:我可能没有清楚地描述这个问题。需求在以下代码段中被注释掉(因为它们不适用于常见的C#扩展方法)。所以我尝试找到另一种方法,启用超出评论的语法:

        // having a class 
    public class Orig { }
    
    // which is extended with some functions (from another assembly)
    public static class ExtOrig {
        public static void ExtMeth (this Orig orig, string bla) {}
    }
    
    // derived classes should DIRECTLY!! see the extension
    public class Derived : Orig {
        public void MyMethod() {
            // ExtMeth("inside orig"); <- does not work
            this.ExtMeth("this derived");  // <- this keyword needed
        }
        // for static methods even worse: 
        public static void MyMethod2() {
            // ExtMeth("inside orig"); <- does not work
            // this.ExtMeth("this derived");  // <- 'this' not usable here :(
        }
    }
    // for shorter syntax, static access would be needed 
    public class SomeClass {
    
        private void SomeFunc() {
            // Orig.ExtMeth("static orig"); <- does not work
            new Orig().ExtMeth("outside orig"); // <- instance needed :(
    
            // Derived.ExtMeth("static derived"); <- does not work
            new Derived().ExtMeth("outside derived"); 
        }
    }
    

2 个答案:

答案 0 :(得分:2)

  1. 扩展方法可以存在于包含要扩展的类型的程序集的单独程序集中。扩展组件只需要引用原始组件。其他程序集中的任何客户端都必须引用原始程序集和扩展程序集。

  2. 扩展方法不能作为扩展类型的静态方法出现。它们只能作为实例方法出现。社区中已经讨论过需要静态扩展方法和可能的实现,但据我所知,MS尚未承诺将此功能添加到C#中。

  3. 扩展方法(具有适当的可见性)对于两种派生类型以及这些派生类型的任何使用者都是可见的。

答案 1 :(得分:0)

扩展方法或部分类不会帮助你。尝试使用Singleton设计模式,因为这可能会为您提供使用实例而非静态成员所需的行为