Проверьте мою запись в блоге о статических методах, реализованных в интерфейсах (извините за бесстыдную ссылку на себя)
[удалено неработающая ссылка http: / ...]
Сайт dotnetjunkies ткнул Totaldevpro ... так что кэшированная версия Google является единственной доступной
Edit:
Я вставил кешированную версию ниже, я нашел:
[...]
Используйте ILAsm для компиляции следующего:
.assembly extern mscorlib {
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 )
.ver 2:0:0:0
}
.assembly MaLio.StaticInterface{
.hash algorithm 0x00008004
.ver 0:1:0:0
}
.module MaLio.StaticInterface.dll
.imagebase 0x00400000
.file alignment 0x00001000
.stackreserve 0x00100000
.subsystem 0x0003
.corflags 0x00000001
.class interface public abstract auto ansi MaLio.IMyInterface {
.method public hidebysig newslot abstract virtual instance void DoInstanceWork() cil managed {
}
.method public hidebysig static void DoStaticWork() cil managed {
ldstr "Static"
call void [mscorlib]System.Console::WriteLine(string)
ret
}
}
.class public auto ansi beforefieldinit MaLio.MyClass extends [mscorlib]System.Object implements MaLio.IMyInterface {
.method public hidebysig newslot virtual final instance void DoInstanceWork() cil managed {
ldstr "Instance"
call void [mscorlib]System.Console::WriteLine(string)
ret
}
.method public hidebysig specialname rtspecialname instance void .ctor() cil managed {
ldarg.0
call instance void [mscorlib]System.Object::.ctor()
ret
}
}
Этот код тогда можно назвать
System.Type myInterface = typeof(MaLio.IMyInterface);
// show that we really are dealing with an interface
if (myInterface.IsInterface) {
System.Reflection.MethodInfo staticMethod = myInterface.GetMethod("DoStaticWork");
staticMethod.Invoke(null, null);
}
Intellisense (VS) не работает здесь должным образом. Он распознал статический метод как метод экземпляра интерфейса, и код (если он следует подсказкам intellisense) выглядит все по порядку, как если бы он собирался компилироваться. Компилятор C # (MS C #) не компилирует код, поскольку C # не поддерживает реализованные статические методы на интерфейсах и может вызываться из C # только через отражение.
Я не тестировал другие IDE, такие как SharpDevelop ... поэтому пока не знаю, как бы он справился с этой ситуацией.