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
如果适合

您,您可以通过获取委托来完成所需的语法:

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();

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

 public Person(String _name){
    name = _name;
   TellMyName();
}
private void TellMyName(){
    Console.WriteLine(name);
}

最新更新