当前位置:  开发笔记 > 编程语言 > 正文

C#委托给两个具有不同参数的方法

如何解决《C#委托给两个具有不同参数的方法》经验,为你挑选了1个好方法。

我使用以下方法:

public void M1(Int32 a)
{
  // acquire MyMutex
  DoSomething(a);
  // release MyMutex
}

public void M2(String s, String t)
{
  // acquire MyMutex
  DoSomethingElse(s, t);
  // release MyMutex
}

从我到目前为止所发现的情况来看,似乎不可能对具有不同签名的两种方法使用单个委托.

有没有其他选择写这样的东西:

public void UsingMutex(...)
{
  // acquire MyMutex
  ...
  // release MyMutex
}

UsingMutex(M1);
UsingMutex(M2);

我现在能想到的只是使用两个委托和一个布尔标志来知道要调用哪个委托,但这不是一个长期的解决方案.

可以将泛型与代表结合起来吗?如果是这样,您是否有任何类型的文档链接?

环境:C#2.0



1> Marc Gravell..:

绝对可以将代表与泛型混合使用.在2.0 Predicate等中就是很好的例子,但你必须拥有相同数量的args.在这种情况下,也许一个选项是使用捕获来包含委托中的args?

    public delegate void Action();
    static void Main()
    {
        DoStuff(delegate {Foo(5);});
        DoStuff(delegate {Bar("abc","def");});
    }
    static void DoStuff(Action action)
    {
        action();
    }
    static void Foo(int i)
    {
        Console.WriteLine(i);
    }
    static void Bar(string s, string t)
    {
        Console.WriteLine(s+t);
    }

请注意,这Action是在.NET 3.5中为您定义的,但您可以为2.0目的重新声明它;-p

请注意,匿名方法(delegate {...})也可以参数化:

    static void Main()
    {
        DoStuff(delegate (string s) {Foo(5);});
        DoStuff(delegate (string s) {Bar(s,"def");});
    }
    static void DoStuff(Action action)
    {
        action("abc");
    }
    static void Foo(int i)
    {
        Console.WriteLine(i);
    }
    static void Bar(string s, string t)
    {
        Console.WriteLine(s+t);
    }

最后,C#3.0使用"lambdas"使这一切变得更加容易和漂亮,但这是另一个主题;-p


@Erik:首先做一个"粗略"的帖子,然后提供更多的细节,避免其他人通过写一个大致相似的答案来浪费时间.我已经多次写过答案,因为看到其他人发布了类似的东西.显而易见的是,IMO越好.
同意.我花了很多时间添加一个详细的答案,只是为了找出其他人已经说过同样的事情并在我做之前发布了它.然后我最终删除了我的答案,浪费了我的时间= \
推荐阅读
李桂平2402851397
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有