,C#的委托类似于C++的委托,现在C++有一个回调函数,回调3个函数中的一个,但是3个函数参数不一样,C#用委托实现,但是参数必须一致

求助,C#的委托类似于C++的委托,现在C++有一个回调函数,回调3个函数中的一个,但是3个函数参数不一样,C#用委托实现,但是参数必须一致
class B {
public:
    virtual int  Succeed(C* c, int delay, int load) = 0;
    virtual int  Fail(C * c, ErrorNo errorNo) = 0;
    virtual int  Complete() = 0;
};
class A{
public:
    virtual ~A() {}
    virtual int Start(C* c, size_t Count, B *fun, int seconds) = 0;
    virtual int Stop() = 0;
};
ErrorNo 是枚举类型这里不贴出来了
B类里面放的是回调函数,这个是C++的接口函数,C++可以用函数指针实现回调,C#要实现的话要使用委托,
public delegate int MyDelegate(C c, int delay, int load, ErrorNo errorNo);其中C类的转换已完成,问题是原回调函数中的第一个回调函数返回值3个,后面的2个和没有,我的委托里面的参数到底该放几个,我写4个肯定不对,委托的参数必须和实现方法一致,现在不一致了,我该怎么去实现,求大神提供思路。
------解决思路----------------------
把3个委托都绑定上
C++爱掉哪个就调哪个
不要企图用同一个回调来执行3个方法啊
那你知道该执行哪个方法吗
------解决思路----------------------
3个handler放在一个类里,C++里传B类的实例,那你也传B类的实例好了
让它自己去调吧
C++那么强,还有什么做不到的,把CLR寄宿到非托管程序中,调用CLR API反射调用B类的中方法
http://blog.****.net/begtostudy/article/details/6215972
------解决思路----------------------
要是它觉得恶心,那就让他改接口呗,比如把B*换个类型
------解决思路----------------------
引用:
回复7#:
我切试试看。
回复9#:
Start是个接口,具体实现我也不知道。

大致可以猜出来
void start(....)
{
 swtich(count)
{
 case 1:
   b::fun1(....);
 break;
case 2:
 b:fun2(...)
....
}
}
------解决思路----------------------
在 .net 中是这样判断和使用委托类型对象的:
Delegate proc;

........
if (proc is MyAction1)
    ((MyAction1)proc)(......);
else if(proc is MyAction2)
    ((MyAction2)proc)(....);

------解决思路----------------------
你传给它的委托应该放几个参数?它根本不管你传几个参数。比如说你可以写
        private static void t1()
        {

        }

        private static void t2(int a)
        {

        }

        private static void t3(string a, int b)
        {

        }

        private static string t4(int a)
        {
            throw new NotImplementedException();
        }


以及测试
    Delegate proc;
    proc = new Action(t1);
    proc = new Action<int>(t2);
    proc = new Action<string, int>(t3);
    proc = new Func<int, string>(t4);


你可以看到 proc 可以引用任何一个方法。这里都说了4种了,返回值也不同。

如果你说“我不知道 proc 应该给几个参数啊?”,这其实就是你没有使用委托的抽象造成的。
------解决思路----------------------
先说清楚你是准备用C#调用C++的dll还是用C#重新实现一遍这个功能。

要在C#里使用C++的类十分困难,如果你对C++对象结构、调用约定和name mangling等内容十分熟悉倒是可以试试,否则还是推荐使用C++/CLI或C++重包装。

如果你要在C#里重新实现这个结构,那么注意A.Start要求传递一个B对象的指针,而在C#中B应该对应于一个抽象类或者接口,而不是一个委托。