确定函数调用是否是静态的

时间:2016-11-21 15:27:08

标签: c# function static

我在班级SerializeUser中有一个功能User。 此功能没有参数。

我想在这两种类型的函数调用中使用不同的功能:

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

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

是否可以检查它是静态函数调用还是非静态函数调用?

2 个答案:

答案 0 :(得分:4)

不,函数不能同时是静态的和非静态的。

可以做的是创建两个方法,一个是静态的,一个是非静态的,尽管它们需要有不同的签名。如果你想让他们都不接受任何争论,他们必须有一个不同的名字,这可能是最好的;鉴于一个人正在一个实例上行事,而另一个人并非如此,几乎可以肯定的是,至少在某种程度上,你应该在他们的名字中反映这些方法。

答案 1 :(得分:0)

我认为你在这里混淆的是,如果你在SerializeUser()对象上定义一个User方法,除非它是静态的,否则你将无法调用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.
        }
    }
}