我在User
類中具有函數SerializeUser
。 此功能沒有參數。確定函數調用是否爲靜態
我想在這兩種類型的功能有不同的功能要求:
User.SerializeUser(); //Do sth...
和
User u = new User();
u.SerializeUser(); //Do sth else...
是否可以檢查它是否是一個靜態函數調用或者非靜態函數呼叫?
我在User
類中具有函數SerializeUser
。 此功能沒有參數。確定函數調用是否爲靜態
我想在這兩種類型的功能有不同的功能要求:
User.SerializeUser(); //Do sth...
和
User u = new User();
u.SerializeUser(); //Do sth else...
是否可以檢查它是否是一個靜態函數調用或者非靜態函數呼叫?
不,函數不能既是靜態的也是非靜態的。
你可以做的是創建兩個方法,一個是靜態的,一個是非靜態的,儘管它們需要不同的簽名。如果你希望他們都不接受任何論點,他們將不得不有不同的名字,這可能是最好的;如果一個人正在處理一個實例,而另一個卻不是,那麼你應該在他們的名字中反映出來的方法至少有點不同。
我認爲你在這裏混淆的是,如果你在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.
}
}
}
你可以不同的方式命名他們...?!但是,不,你不能寫你在你的例子中給出的代碼。請解釋*爲什麼*你想要這樣的可惡! –
在同一個類上不能有一個非靜態的'SerializeUser'和一個靜態的'SerializeUser'。但是,你爲什麼要這樣做? – Amy
「檢查」是什麼意思?你的第一個樣本調用一個'static'方法,你的第二個樣本調用一個實例方法。 (注意:我懷疑編譯器會允許你有其他方法,但我可能會誤解)。你真的不知道你在這裏做了什麼。 – David