Существующий тип в C # должен быть расширен с помощью некоторых новых методов, так что встречается следующее:
- методы расширения должны сопротивляться в другой сборке
- они должны выглядеть как static методы исходного типа
- они также должны быть видны разработчикам производных классов исходного типа
Пример, Assembly 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
}
Первое требование (статический контекст вне сборки), кажется, не является полностью исполняемым?Так есть ли другой потенциальный подход?
@ Редактировать: Возможно, я не описал проблему четко.Потребности закомментированы в следующем фрагменте (поскольку они не работают с распространенными методами расширения 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");
}
}