2012-02-05 18 views
10
public class BusinessObjects<O> 
    where O : BusinessObject 
{ 
    void SomeMethod() 
    { 
     var s = O.MyStaticMethod(); // <- How to do this? 
    } 
} 

public class BusinessObject 
{ 
    public static string MyStaticMethod() 
    { 
     return "blah"; 
    } 
} 

Esiste un approccio orientato agli oggetti corretto per realizzare questo o sarà necessario ricorrere alla riflessione?Come accedere ai metodi statici dei tipi generici

EDIT: Sono andato troppo lontano nel cercare di semplificare troppo questo per la domanda e ho lasciato fuori un punto importante. MyStaticMethod utilizza la reflection e ha bisogno del tipo derivato per restituire i risultati corretti. Tuttavia, ho appena realizzato un altro difetto nel mio progetto che è che non posso avere un metodo statico virtuale e penso che sia quello di cui avrei bisogno.

Sembra che ho bisogno di trovare un altro approccio a questo problema del tutto.

+0

Guarda qui per ulteriori informazioni: http://stackoverflow.com/q/196661/114029 –

+0

Penso che questa sia una buona domanda. Al momento non può essere fatto in C#. Ma questo sarebbe utile per Microsoft da aggiungere a .Net 5+ – MarzSocks

risposta

2

Il motivo non è possibile fare riferimento al membro statico come questo:

O.MyStaticMethod(); 

Is perché non sai quale sia il tipo O. Sì, eredita da BusinessObject, ma i membri statici non sono ereditati tra i tipi, quindi puoi solo fare riferimento a MyStaticMethod da BusinessObject.

+0

@DanielHilgarth, rimosso l'esempio errante. Sebbene il compilatore consenta di chiamare il metodo statico tramite una classe derivata, è comunque vero che i membri statici non vengono ereditati. L'IL generato in realtà chiamerà il metodo sulla classe base. E ancora, sebbene il compilatore lo permetta, fare riferimento ai metodi statici dal tipo derivato è una cattiva forma e può portare a confusione, specialmente quando si usano modelli creazionali. – roken

+0

Hai ragione nel tuo commento quando dici che il compilatore cambierà 'Foo.MyStaticMethod()' in 'BusinessObject.MyStaticMethod()'. Tuttavia, questo non rende la risposta corretta. Semplicemente non è corretto, che puoi solo fare riferimento (intendevi "call"?) 'MyStaticMethod' da' BusinessObject'. –

+0

O è un parametro di tipo generico. Come abbiamo già concordato, non esiste un'eredità di metodi statici tra i tipi, quindi non ci si può aspettare di poter chiamare questo metodo su un tipo O derivato da BusinessObject in questo contesto. Il team del compilatore avrebbe potuto fornire un po 'di magia qui come nel caso del nome esplicito, ma [per fortuna] non l'hanno fatto. Sarò d'accordo sul fatto che la mia risposta non sia così verbosa come potrebbe essere, ma non la definirei errata. – roken

12

Non è possibile accedere a un metodo statico tramite un parametro di tipo generico anche se è vincolato a un tipo. Basta usare la classe vincolata direttamente

var s = BusinessObject.MyStaticMethod(); 

Nota: Se stai cercando di chiamare il metodo statico in base al tipo di un'istanza O che non è possibile senza riflessione. I generici in .Net si legano staticamente ai metodi in fase di compilazione (diversamente dal C++ che si lega al momento dell'istanziazione). Poiché non esiste un modo per associare staticamente a un metodo statico sul tipo istanziato, ciò non è possibile. I metodi virtuali sono un po 'diversi perché è possibile associare staticamente a un metodo virtuale e quindi lasciare che il dispatch dinamico invochi il metodo corretto sul tipo istanziato.

+0

Indovina che non ho fornito informazioni sufficienti. Controlla momentaneamente una domanda aggiornata ... –

+0

@BrandonMoore aggiorna la mia risposta un po 'per essere un po' più dettagliata sui limiti – JaredPar

+0

Sì, e poiché non posso avere un metodo statico virtuale che uccide il mio approccio. Penso che la riflessione sarà la strada da percorrere. –

2

Se si stanno costringendo O ereditare da BusinessObject, perché non basta chiamare in questo modo:

void SomeMethod() 
{ 
    var s = BusinessObject.MyStaticMethod(); // <- How to do this? 
} 
+0

Vedere la domanda aggiornata –

Problemi correlati