我有一个类,我希望存储一个函数调用。此函数调用可以由类调用,但由父类设置。我想从外部提供要进行的调用,包括任何参数。
像...一样的东西。
public class TestDelegate
{
public TestDelegate()
{
TestClass tc = new TestClass(DoSomething("blabla", 123, null));
}
private void DoSomething(string aString, int anInt, object somethingElse)
{
...
}
}
public class TestClass
{
public TestClass(delegate method)
{
this.MethodToCall = method;
this.MethodToCall.Execute();
}
public delegate MethodToCall { get; set; }
}
初始化TestClass
类时,它将使用指定的参数调用父类的DoSomething方法。我还要提一下,我不想为所调用的方法要求相同的方法签名。意义并非总是(字符串,整数,对象)
答案 0 :(得分:5)
使用Action
委托类型并从闭包中创建一个这样的实例:
public class TestClass
{
public TestClass(Action method)
{
MethodToCall = method;
method();
}
public Action MethodToCall { get; set; }
}
public class TestDelegate
{
public TestDelegate()
{
// Uses lambda syntax to create a closure that will be represented in
// a delegate object and passed to the TestClass constructor.
TestClass tc = new TestClass(() => DoSomething("blabla", 123, null));
}
private void DoSomething(string aString, int anInt, object somethingElse)
{
// ...
}
}
答案 1 :(得分:3)
delegate
不是类型的名称 - 它是用于声明委托类型的关键字,也是匿名方法。
我怀疑你实际上想要一个特定类型的委托,例如Action
,它是一个没有参数和void返回类型的委托。然后,您还需要更改调用代码 - 因为在调用构造函数之前,您目前正在调用 DoSomething
。样品:
public class TestDelegate
{
public TestDelegate()
{
TestClass tc = new TestClass(() => DoSomething("blabla", 123, null));
}
private void DoSomething(string aString, int anInt, object somethingElse)
{
...
}
}
public class TestClass
{
public TestClass(Action method)
{
this.MethodToCall = method;
this.MethodToCall.Invoke();
}
// Do you really need this to be writable?
public Action MethodToCall { get; set; }
}