代码之家  ›  专栏  ›  技术社区  ›  alexandrul

两种参数不同的方法的C#委托

  •  15
  • alexandrul  · 技术社区  · 16 年前

    我使用以下方法:

    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

    3 回复  |  直到 16 年前
        1
  •  20
  •   Marc Gravell    16 年前

    绝对可以将委托与泛型混合使用。在2.0中, Predicate<T> etc是很好的例子,但是必须有相同数量的arg。在这种情况下,可能有一种选择是使用捕获将参数包括在委托中?

        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<string> 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

        2
  •  4
  •   Mehrdad Afshari    16 年前

    public delegate void Action<T>(T x);
    public delegate void Action<T,U>(T x, U y);
    
    public void UsingMutex<T>(Action<T> x, T t) {
        // acquire mutex...
        x(t);
        // release mutex...
    }
    public void UsingMutex<T,U>(Action<T,U> x, T t, U u) {
        // acquire mutex...
        x(t, u);
        // release mutex...
    }
    

    但是您仍然必须使用重载处理不同数量的参数。

        3
  •  3
  •   Brian Rasmussen    16 年前

    Func<T> Action<T>