微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决可以从某种方法名称集合中创建C#4.0中的多播委托吗?

| 我正在用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;
显然,它看起来并不好。有什么标准方法可以从方法名称集合中创建多播委托?     

解决方法

        对此类任务使用静态方法“ 3”。
 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) { }
现在,如果您不介意两次键入代表姓名,则可以将它们直接与ѭ6组合:
    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,foo3);
或者,如果您根本不想键入委托名称,则可以编写一个非泛型函数来组合它们:
    public static foo Combine(params foo[] del)
    {
        return (foo)Delegate.Combine(del);
    }

    foo multicast3 = Combine(foo1,foo3);
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。