1

我想实现一个可以在我的自定义类中找到东西的方法。它应该像通用集合一样工作——我将一个指针传递给一个函数,该方法将遍历它必须查看的所有内容,应用此函数,如果它返回 true,则返回找到的项目。

我想将函数指针作为参数传递,但我不想声明委托类型。

我知道我可以做类似的事情:

delegate bool Foo(MyClass)
MyClass MyMethod(Foo x)
{...}

我知道我可以做这样的事情:

MyClass MyMethod(Func<MyClass,bool> x)

但是我可以在不声明委托类型并且不使用诸如 Func<> 之类的内置东西的情况下做到这一点,它对我可以拥有的参数数量有限制(在 Func 的情况下,一个......)

4

3 回答 3

0

您总是可以传入一个Delegate并在其上调用DynamicInvoke

MyClass MyMethod(Delegate x) {
    // ...
    x.DynamicInvoke(....);
    // ...
}
于 2012-04-07T07:18:35.773 回答
0

如果你愿意,你可以使用委托,虽然它有点老派:)

public void TestInvokeDelegate()
{
    InvokeDelegate( new TestDelegate(ShowMessage), "hello" );
}

public void InvokeDelegate(TestDelegate del, string message)
{
    del(message);
}

public delegate void TestDelegate(string message);

public void ShowMessage(string message)
{
    Debug.WriteLine(message);
}
于 2012-04-07T07:26:59.527 回答
0

看起来您正在尝试实现访问者模式。在这种情况下,访问方法通常只有一个参数——要访问的实例。传递额外的参数会隐藏模式的使用,并使其更难推理。本文向您展示了在 C# 中实现它的一种方法。

关键是创建一个访问者类,它将封装所有影响访问过程的参数。这样,您不需要在访问方法中传递除了有问题的对象之外的任何东西——其他所有东西都存在于实例字段中。

但是,如果你真的想在方法中传递一些额外的参数并且不知道它们可以有什么类型,有办法做到这一点。.NET 世界中或多或少的标准方法是使用没有返回值且具有单个参数类型object的委托,例如ParameterizedThreadStart 委托

public delegate void ParameterizedThreadStart(
    Object obj
)

这样你就可以在委托中只传递一个参数,但它可以是任何东西——一个类的实例、一个数组或 null,如果你最终不需要额外的参数的话。这种方法的缺点是它需要类型转换,这会导致运行时错误。

于 2012-04-07T07:40:12.623 回答