2016-11-21 4 views
0

Ich habe eine Funktion SerializeUser in der Klasse User. Diese Funktion hat keinen Parameter.Ermitteln, ob Funktionsaufruf statisch ist

ich verschiedene Funktionen in diesen beiden Arten von Funktionsaufrufe haben wollen:

User.SerializeUser(); //Do sth... 

und

User u = new User(); 
u.SerializeUser(); //Do sth else... 

Ist es möglich, zu überprüfen, ob es sich um eine statische Funktion Anruf oder eine nicht statische Funktion ist Anruf?

+1

Sie sie anders nennen könnte ...?! Aber nein, Sie können den Code, den Sie in Ihrem Beispiel angegeben haben, nicht schreiben. Bitte erklären Sie * warum * Sie so eine Abscheulichkeit wollen! –

+1

Sie können keinen nicht statischen 'SerializeUser' und keinen statischen' SerializeUser' für dieselbe Klasse verwenden. Aber warum willst du das machen? – Amy

+0

Was meinst du mit "check"? Ihr erstes Beispiel ruft eine 'statische' Methode auf, Ihr zweites Beispiel ruft eine Instanzmethode auf. (Anmerkung: Ich bezweifle, dass der Compiler Ihnen ansonsten identische Methoden zulässt, aber ich könnte mich irren.) Es ist nicht wirklich klar, was Sie hier eigentlich erreichen wollen. – David

Antwort

4

Nein, eine Funktion kann nicht statisch und nicht statisch sein.

Was Sie können Do zwei Methoden erstellen, eine statische und eine nicht-statische, obwohl sie unterschiedliche Signaturen haben müssen. Wenn Sie wollen, dass sie beide keine Argumente akzeptieren, müssen sie einen anderen Namen haben, der wahrscheinlich der Beste ist; Da man auf eine Instanz einwirkt und eine andere nicht, gibt es mit ziemlicher Sicherheit etwas zumindest etwas anderes darüber, was die Methoden tun, die man in ihrem Namen reflektieren sollte.

0

denke ich, was Sie verwirrend ist hier, dass, wenn Sie eine Methode definieren, SerializeUser() auf Ihrem User Objekt, werden Sie nicht in der Lage sein User.SerializeUser() zu nennen, wenn sie statisch ist. Wenn es ist statische, dann werden Sie nicht in der Lage sein zu tun - Sie können nur beide mit zwei Methoden, den gleichen Namen oder nicht, und Sie können nur den gleichen Namen haben, wenn Sie ihre Signaturen unterscheiden, damit der Compiler auflösen kann welches zu verwenden.

Der einzige Weg, dieses Gefühl als etwas macht hat man tun mag, ist, wenn die Instanz-Methode die Instanz als Argument an die statischen Methode übergibt, und die statische Methode akzeptiert eine Instanz als Parameter, das heißt:

Sie können auch etwas anderes verwenden, um sie zu unterscheiden, z. B. einen booleschen Wert mit einem Standardwert oder ohne einen Standardwert. Ex. Wenn die statische Methode einen bool flag = false Parameter hat, dann könnte die Instanzmethode sie mit flag = true aufrufen und dann können Sie das Verhalten differenzieren. Dies ist jedoch ein etwas böser Code, da er die Methode hinter der schwierigen Überladungsauflösung versteckt.

Um Ihre Frage direkt zu beantworten, können Sie überprüfen, ob die aktuelle Methode statisch ist mit MethodBase.GetCurrentMethod().IsStatic, aber ich denke nicht, dass das tatsächlich in dieser Situation von Nutzen sein wird.

auf den Code der Suche, aber ich stelle mir vor, was Sie wollen, ist dies:

namespace MyNamespace 
{ 
    public class User 
    { 
     public static string SerializeUser(User u = null) 
     { 
      if (u != null) 
       return u.SerializeUser(); 
      else 
       return "something"; //default(User).SerializeUser();? 
     } 
    } 

    public static class UserExtensions 
    { 
     public static string SerializeUser(this User u) 
     { 
      //return however you serialize your user. 
     } 
    } 
}