17

我正在使用以下方法:

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

4

3 回答 3

20

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

IE

    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

于 2008-12-18T08:37:34.977 回答
4

是的,可以将泛型与委托结合起来。

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...
}

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

于 2008-12-18T08:40:22.507 回答
3

如果您查看框架中的Func<T>Action<T>委托,您会发现它们定义了许多具有不同数量参数的类似委托。您可以使用泛型,但这并不能解决您正在谈论的参数数量问题。

于 2008-12-18T08:39:02.137 回答