对对象的C#重载函数调用

时间:2018-12-23 19:48:30

标签: c#

这是一个奇怪的问题,但我想到了,并感到好奇:

假设我有一堂课:

public class Person{
    public String name;

    public Person(String _name){
        name = _name;
    }

    public void TellMyName(){
        Console.WriteLine(name);
    }
}

然后,在代码中的某个地方创建一个Person实例。

Person p = new Person("John");

我是否可以编写p()(好像是一个函数调用)并触发p.TellMyName()

Person p = new Person("John");
p();

//output: John

2 个答案:

答案 0 :(得分:3)

如果可以的话,您可以通过委托来完成所需的语法:

public class Person
{
    public string _name;

    public Person(string name)
    {
        _name = name;
    }

    public void TellMyName()
    {
        Console.WriteLine(_name);
    }
}

// ...

var o = new Person("John");
var p = (Action)o.TellMyName;
p();

或者您可以将构造函数更改为Create方法并使用以下方法:

public class Person
{
    public string _name;

    private Person(string name)
    {
        _name = name;
    }

    public static Action Create(string name)
    {
        return new Person(name).TellMyName;
    }

    public void TellMyName()
    {
        Console.WriteLine(_name);
    }
}

// ...

var p = Person.Create("John");
p();

要加倍努力吗?好的,我们开始:

public class Person : System.Dynamic.DynamicObject
{
    public string _name;

    public Person(string name)
    {
        _name = name;
    }

    public void TellMyName()
    {
        Console.WriteLine(_name);
    }

    public override bool TryInvoke(
        System.Dynamic.InvokeBinder binder, object[] args, out object result)
    {
        result = null;
        if (args.Length == 0)
        {
            TellMyName();
            return true;
        }
        return false;
    }
}

// ...

dynamic p = new Person("John");
p();

答案 1 :(得分:-1)

否,您不能像普通方法p();一样调用构造函数,而是在实例化对象时调用它,但是是的,您可以通过在ctor内调用该方法来完成所需的操作喜欢

 public Person(String _name){
    name = _name;
   TellMyName();
}

private void TellMyName(){
    Console.WriteLine(name);
}