C#是否支持__call__方法?

时间:2011-02-01 03:58:35

标签: c#

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


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

3 个答案:

答案 0 :(得分:5)

当然,如果你继承自DynamicObject。我认为你是在obj(...)上执行的TryInvoke之后,但是你可以覆盖其他几种方法来处理转换,索引访问(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;
        }
    }
}

答案 1 :(得分:4)

我向西蒙·斯文森(Simon Svensson)鞠躬致敬 - 如果你从动态对象那里继承下去,他会展示一种方法 - 为了更加明确的前向非动态观点:

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

 Func<int, int> myDelagate = x=>x*2; 
 int four = myDelagate(2)  

虽然有一个默认属性 - 必须至少有一个参数,其访问权限类似于数组访问:

class Test1
{
    public int this[int i, int j]
    {
        get { return i * j; }
    }
}

致电

        Test1 test1 = new Test1();
        int six = test1[2, 3];

然后你可以像这样的代表做一些非常愚蠢的事情:

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

然后调用它看起来很奇怪:

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

答案 2 :(得分:3)

这类似于重载函数调用操作符(在C ++中可能)。不幸的是,这不是C#支持的东西。可以像方法一样调用的唯一对象是委托实例。