【问题标题】:C# function that takes pointer to function as an in parameter without declaring any specific delegate types?将指向函数的指针作为 in 参数而不声明任何特定委托类型的 C# 函数?
【发布时间】:2012-04-07 06:38:07
【问题描述】:

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

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

我知道我可以这样做:

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

我知道我可以这样做:

MyClass MyMethod(Func<MyClass,bool> x)

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

【问题讨论】:

  • 好吧,也许您可​​以使用对象数组来实现功能?
  • 在 .NET 3.5 中,Func 可以有多个参数。 msdn.microsoft.com/en-us/library/bb549151(v=vs.90).aspx 见:i.imgur.com/yQIaf.png
  • 谢谢。不过,有没有办法在方法声明中声明委托的类型,还是我必须使用 Func?
  • 您可以通过使用反射来使用 string 来实现。但这会很慢,容易崩溃并且难以阅读。代表没有的问题。

标签: c# delegates


【解决方案1】:

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

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);
}

【讨论】:

  • 我想拥有 public void InvokeDelegate(TestDelegate del, string message) 而无需声明 TestDelegate - 我想声明“函数 InvokeDelegate 接受一个函数指针,它接受字符串并返回 void” - 我可以做吗?
  • 不,你不能这样做,你在考虑 C++。 Func 或 Action 有什么问题?
  • 没有,我只是问我能不能做到:)
【解决方案2】:

您始终可以传入Delegate 并在其上调用DynamicInvoke

MyClass MyMethod(Delegate x) {
    // ...
    x.DynamicInvoke(....);
    // ...
}

【讨论】:

  • 换句话说,Delegate 代表一个通用方法,我可以将任何参数传递给它并期望最终得到任何值?它就像函数的“对象”?
【解决方案3】:

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

关键是创建一个访问者类,它将封装所有影响访问过程的参数。这样,您无需在访问方法中传递除相关对象之外的任何内容 - 其他所有内容都位于实例字段中。

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

public delegate void ParameterizedThreadStart(
    Object obj
)

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

【讨论】:

  • @Istrebitel:好吧,您在第一段中描述的内容正是发明了访问者模式的目的,因此您可能应该研究一下
  • 不,实际上,我只需要我的自定义 TreeView 的搜索功能,它可以搜索树节点的标签。所以我想向它传递一个函数指针,它会将此函数应用于每个树节点,直到遇到 True。该方法的参数是选中的 TreeNode。现在,我只想知道我是否可以在不声明委托类型的情况下做到这一点
猜你喜欢
  • 2011-07-11
  • 1970-01-01
  • 2011-06-20
  • 1970-01-01
  • 2011-04-11
  • 1970-01-01
  • 2012-01-30
  • 2016-10-10
  • 1970-01-01
相关资源
最近更新 更多