Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#4.0中的多播委托能否从某种方法名称集合中创建?_C#_.net_Delegates - Fatal编程技术网

C#4.0中的多播委托能否从某种方法名称集合中创建?

C#4.0中的多播委托能否从某种方法名称集合中创建?,c#,.net,delegates,C#,.net,Delegates,我正在用XNA编写一个简单的游戏,我遇到了一个代表的问题。我用它们来表示游戏中的物理,例如: public delegate void PhysicsLaw(World world); //for gravitation static public void BallLawForGravity(World world) { if (world.ball.position.Y != world.zeroLevel) //v(

我正在用XNA编写一个简单的游戏,我遇到了一个代表的问题。我用它们来表示游戏中的物理,例如:

public delegate void PhysicsLaw(World world);

//for gravitation
static public void BallLawForGravity(World world)
        {
            if (world.ball.position.Y != world.zeroLevel)
                //v(t) = v0 + sqrt(c * (h - zeroLevel))
                world.ball.speed.Y += (float)Math.Sqrt(0.019 * (world.zeroLevel - world.ball.position.Y)); 
        }
我想为不同的对象/环境创建多播代理,这些对象/环境由许多方法组成,例如
BallLawForGravity()
,但我只能这样做:

processingList = BallLawForBounce;
processingList += BallLawForAirFriction;
...
processingList += BallLawForGravity;
显然,它看起来不太好。是否有任何标准方法可以从方法名称集合创建多播委托?

对此类任务使用静态方法

 PhysicsLaw[] delegates = new PhysicsLaw[] {
        new PhysicsLaw( PhysicsLaw ),
        new PhysicsLaw( BallLawForAirFriction )
    };

    PhysicsLaw chained = (PhysicsLaw) Delegate.Combine( delegates );
    chained(world);

更新
您可以使用,但我不推荐它,因为它的技术非常慢。

假设您已声明

    public delegate void foo(int x);
    public static void foo1(int x) { }
    public static void foo2(int x) { }
    public static void foo3(int x) { }
现在,您可以直接将它们与
代理组合。如果您不介意键入两次代理名称,请将它们组合起来:

    foo multicast = (foo)Delegate.Combine(new foo[] { foo1, foo2, foo3 });
或者,如果您不介意键入一次代理名称,您可以编写一个通用函数来组合它们:

    public static T Combine<T>(params T[] del) where T : class
    {
        return (T)(object)Delegate.Combine((Delegate[])(object[])del);
    }

    foo multicast2 = Combine<foo>(foo1, foo2, foo3);

我尝试过使用这个方法,但它使用委托,而不是方法名作为参数,或者我遗漏了一些东西<在每个方法名称之前,code>new
看起来并没有太好。我现在正在使用LINQ:
public static PhysicsLaw MakeFromCollection(PhysicsLaw initial,params PhysicsLaw[]methods){return methods.Aggregate(initial,(current,method)=>current+method);}
OP询问如何一次性分配方法,这将形成委托的调用列表,而不是组合众多方法的列表delegates@Lakret对不起,我不太明白。不幸的是,你不能简单地使用方法名——只能通过反射,这是一个沉重而缓慢的解决方案。现在,为什么不尝试创建一个单独的处理程序
PerformPhysislaws(World World)
,它只调用你需要的所有其他方法呢?我有几个对象,我想对它们应用不同的法则——更重要的是,我认为是陈述式的。我是一个函数式程序员,所以我喜欢用函数组合来表达东西,这里的多播代理就是模仿这种思维方式。为什么“列表=列表+反弹+摩擦+重力”不能接受?@Lakret:我不明白。这是一种什么样的“黑客行为”?你会说“总计=总计+费用+税金+费用”也是“黑客”吗?为什么正确使用加法运算符是一个“hack”?@Lakret:您可以将最左边的运算符转换为所需的委托类型,然后通过加法的左关联性将其余的运算符转换为所需的委托类型。列表=(D)反弹+摩擦+重力;谢谢,它接近我的解决方案,在我不使用LINQ的项目中,我会按照你的建议去做。@Lankret:为什么在
委托时使用LINQ。Combine
已经做了你想做的事情了?因为我已经在代码中更改了很多地方:),但我已经在函数中放弃了它,现在使用你的解决方案。
    public static foo Combine(params foo[] del)
    {
        return (foo)Delegate.Combine(del);
    }

    foo multicast3 = Combine(foo1, foo2, foo3);