Python有一个神奇的__call__
方法,当像对象一样被调用时,它会被调用。 C#是否支持类似的东西?
具体来说,我希望能够交替使用委托和对象。试图设计一个API,用户可以在其中传入函数列表,但有时这些函数需要一些初始参数,在这种情况下,他们会使用其中一个可调用对象。
答案 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#支持的东西。可以像方法一样调用的唯一对象是委托实例。