C#中的现有类型需要使用一些新方法进行扩展,以便满足以下条件:
示例,程序集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");
}
}
答案 0 :(得分:2)
扩展方法可以存在于包含要扩展的类型的程序集的单独程序集中。扩展组件只需要引用原始组件。其他程序集中的任何客户端都必须引用原始程序集和扩展程序集。
扩展方法不能作为扩展类型的静态方法出现。它们只能作为实例方法出现。社区中已经讨论过需要静态扩展方法和可能的实现,但据我所知,MS尚未承诺将此功能添加到C#中。
扩展方法(具有适当的可见性)对于两种派生类型以及这些派生类型的任何使用者都是可见的。
答案 1 :(得分:0)
扩展方法或部分类不会帮助你。尝试使用Singleton设计模式,因为这可能会为您提供使用实例而非静态成员所需的行为