2016-11-21 37 views
0

我在User類中具有函數SerializeUser。 此功能沒有參數。確定函數調用是否爲靜態

我想在這兩種類型的功能有不同的功能要求:

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

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

是否可以檢查它是否是一個靜態函數調用或者非靜態函數呼叫?

+1

你可以不同的方式命名他們...?!但是,不,你不能寫你在你的例子中給出的代碼。請解釋*爲什麼*你想要這樣的可惡! –

+1

在同一個類上不能有一個非靜態的'SerializeUser'和一個靜態的'SerializeUser'。但是,你爲什麼要這樣做? – Amy

+0

「檢查」是什麼意思?你的第一個樣本調用一個'static'方法,你的第二個樣本調用一個實例方法。 (注意:我懷疑編譯器會允許你有其他方法,但我可能會誤解)。你真的不知道你在這裏做了什麼。 – David

回答

4

不,函數不能既是靜態的也是非靜態的。

可以做的是創建兩個方法,一個是靜態的,一個是非靜態的,儘管它們需要不同的簽名。如果你希望他們都不接受任何論點,他們將不得不有不同的名字,這可能是最好的;如果一個人正在處理一個實例,而另一個卻不是,那麼你應該在他們的名字中反映出來的方法至少有點不同。

0

我認爲你在這裏混淆的是,如果你在User對象上定義了一個方法SerializeUser(),那麼除非它是靜態的,否則你將無法調用User.SerializeUser()。如果它是是靜態的,那麼你將無法做到new User().SerializeUser() - 只能使用兩種方法,即相同名稱和兩種方法來執行這兩種方法,並且如果區分其簽名以便編譯器可以解析,則只能使用相同名稱哪一個使用。

,這是有道理的東西,唯一的方法你會做的是,如果實例方法通過實例作爲參數傳遞給靜態方法,和靜態方法接受一個實例作爲一個參數,即:

namespace MyNamespace 
{ 
    public class MyClass 
    { 
     public static void Method(MyClass c = null) 
     { 
      if (c == null) 
      { 
       //Do Stuff From Static 
      } 
      else 
      { 
       //Do Different Stuff With Instance 
      } 
     } 

     public void Method() 
     { 
      Method(this); 
     } 
    } 
} 

您還可以使用其他方式來區分它們,例如具有默認值的布爾值,或者沒有默認值。防爆。如果靜態方法有bool flag = false參數,那麼實例方法可以用flag = true調用它,然後您可以使行爲有所區別。但這是一個稍微令人討厭的代碼,因爲它隱藏了棘手重載解決方案的方法。

要直接回答您的問題,您可以檢查當前的方法是否爲MethodBase.GetCurrentMethod().IsStatic,但在這種情況下,我認爲這不會對您有用。

看你的代碼,不過,我想你想要的是這樣的:

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. 
     } 
    } 
}