C#是否支持__call__方法?

mpe*_*pen 4 c#

Python有一个神奇的__call__方法,当像对象一样被调用时,它会被调用.C#是否支持类似的东西?


具体来说,我希望能够交替使用委托和对象.试图设计一个API,用户可以在其中传入函数列表,但有时这些函数需要一些初始参数,在这种情况下,他们会使用其中一个可调用对象.

Nei*_*eil 6

我向 Simon Svensson 致敬 - 如果你继承 DynamicObject,他展示了一种方法 - 以获得更直接的非动态观点:

抱歉,没有 - 但可以调用某些类型的对象 - 例如委托。

 Func<int, int> myDelagate = x=>x*2; 
 int four = myDelagate(2)  
Run Code Online (Sandbox Code Playgroud)

不过,有一个默认属性 - 必须至少有一个参数,并且其访问看起来像数组访问:

class Test1
{
    public int this[int i, int j]
    {
        get { return i * j; }
    }
}
Run Code Online (Sandbox Code Playgroud)

呼唤

        Test1 test1 = new Test1();
        int six = test1[2, 3];
Run Code Online (Sandbox Code Playgroud)

然后你可以用代表做一些非常愚蠢的事情,如下所示:

class Test2 // I am not saying that this is a good idea. 
{
    private int MyFunc(int z, int i)
    {
    return z * i;
    }
    public Func<int, int> this[int i] { get { return x => MyFunc(x, i); } }
}
Run Code Online (Sandbox Code Playgroud)

然后调用它看起来很奇怪,如下所示:

        Test2 test = new Test2();
        test[2](2); // this is quite silly - don't use this.....
Run Code Online (Sandbox Code Playgroud)


sis*_*sve 5

当然,如果你继承了DynamicObject.我认为你是在执行on的TryInvoke之后obj(...),但是你可以覆盖其他几种方法来处理转换,索引访问(obj[idx]),方法调用,属性调用等.

using System;
using System.Diagnostics;
using System.Dynamic;
using System.Linq;
using System.Text;

namespace ConsoleApplication {
    public static class ConsoleApp {
        public static void Main() {
            dynamic x = new MyDynamicObject();
            var result = x("awe", "some");

            Debug.Assert(result == "awesome");
        }
    }

    public class MyDynamicObject : DynamicObject {
        public override Boolean TryInvoke(InvokeBinder binder, Object[] args, out Object result) {
            result = args.Aggregate(new StringBuilder(), (builder, item) => builder.Append(item), builder => builder.ToString());
            return true;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • +1 哇!- 看看动态的惊人力量。我可能永远不会使用这个,但很高兴知道...... (2认同)