我想实现一个可以在我的自定义类中查找内容的方法。它应该像泛型集合一样工作 - 我传递一个指向函数的指针,该方法将迭代它所有必须查看的内容,应用此函数,如果它返回true,则返回找到的项目。
我想将函数指针作为参数传递,但我不想声明委托类型。
我知道我可以这样做:
delegate bool Foo(MyClass)
MyClass MyMethod(Foo x)
{...}
我知道我可以这样做:
MyClass MyMethod(Func<MyClass,bool> x)
但是,如果不声明委托类型并且不使用像Func&lt;&gt;这样的内置函数,我可以这样做吗?这限制了我可以拥有多少参数(如果是Func,一个......)
答案 0 :(得分:0)
您随时可以传递Delegate并致电DynamicInvoke:
MyClass MyMethod(Delegate x) {
// ...
x.DynamicInvoke(....);
// ...
}
答案 1 :(得分: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);
}
答案 2 :(得分:0)
您似乎正在尝试实施Visitor pattern。在这种情况下,访问方法通常只有一个参数 - 要访问的实例。传递额外的参数隐藏了模式的使用并使其难以推理。 This article向您展示了在C#中实现它的一种方法。
关键是要创建一个访问者类,它将封装影响访问过程的所有参数。这样,您不需要在访问方法中传递除相关对象之外的任何其他内容 - 其他所有内容都存在于实例字段中。
但是,如果你真的想在方法中传递一些额外的参数并且不知道它们可以具有什么类型,那么有很多方法可以做到这一点。 .NET世界中或多或少的标准方法是使用没有返回值的委托和类型为object
的单个参数,示例为ParameterizedThreadStart delegate:
public delegate void ParameterizedThreadStart(
Object obj
)
这样你只能在委托中传递一个参数,但它可以是任何东西 - 类的实例,数组或null,如果你最终不需要额外的参数。这种方法的缺点是它需要类型转换,这可能导致运行时错误。