Ho il codice qui sotto:compilatore C#: non può accedere metodo statico in un contesto non-statico
public class Anything
{
public int Data { get; set;}
}
public class MyGenericBase<T>
{
public void InstanceMethod(T data)
{
// do some job
}
public static void StaticMethod(T data)
{
// do some job
}
// others members...
}
public sealed class UsefulController : MyGenericBase<Anything>
{
public void ProxyToStaticMethod()
{
StaticMethod(null);
}
// others non derived members...
}
public class Container
{
public UsefulController B { get; set; }
}
public class Demo
{
public static void Test()
{
var c = new Container();
c.B.InstanceMethod(null); // Works as expected.
c.B.StaticMethod(null); // Doesn't work.
// Static method call on object rather than type.
// How to get the static method on the base type ?
c.B.ProxyToStaticMethod(); // Works as expected.
}
}
Il compilatore è molto arrabbiato ... Capisco il messaggio di errore, ma non so come risolvi questo. Stavo cercando di ottenere un tipo piuttosto che un oggetto per effettuare la chiamata al metodo statico, ma non trovo il modo di farlo correttamente. Inoltre questo si traduce in qualcosa di non elegante affatto.
Fondamentalmente, GenericBase è una classe da un framework con molti metodi statici e alcuni metodi di istanza. Il controller sta scrivendo questa classe e la estende.
Il contenitore è un gruppo di controller logici correlati.
Interessante: una versione Java di questo codice viene compilata correttamente, ma con un avviso. Anche l'esecuzione è corretta.
Esiste un modello di progettazione per risolvere questo?
Grazie per i vostri input!
Ho trovato un modo per sbarazzarsi di questo problema, grazie alle vostre risposte. Sembra funzionare, ma non so dirti se ci sono effetti collaterali.
public class GenericBase<T> : MyGenericBase<T>
{
// Create instance calls here for every base static method.
}
public sealed class UsefulController : GenericBase<Anything>
{
// others non derived members...
}
Molto istruttivo, grazie!Leggendo le risposte di seguito, mi sto chiedendo una possibile soluzione. Sentiti libero di commentare. –
dopo tutto, non si chiamano STATIC per niente – BlackTigerX