c# 如何从另一个 class 中的通用扩展方法调用 Action
c# how to call an Action from generic extension method in another class
我正在尝试编写一个函数库,供我项目中的所有 classes 使用(一个小的统一游戏)。可能已经有人问过这个问题,但我不确定要搜索什么并且还没有找到任何东西,所以我来了。
我想在库中创建一个函数,该函数接收一个委托参数(或者至少是一个 Action 类型的对象,不确定它是否真的称为委托)并运行它。问题是,此 Action 必须由另一种类型的对象调用并可能修改它(这意味着它必须由另一个对象调用)。我正在考虑为此使用通用扩展方法。
这是我现在的一些代码(虽然这段代码不起作用,但应该非常明确):
public static class Library
{
public static void doStuffandCallMethod<T>(this T self, Action methodToExecute) {
//DoStuff
self.methodToExecute();
}
}
这是我对这段代码进行概括的尝试:
public static void WaitAndDo( Action methodToExecute) {
//DoSuff();
methodToExecute();
}
效果很好。
但是,编译器不理解并在class T 中寻找一个名为methodToExecute 的方法,而不是用参数(Action)methodToExecute 描述的方法替换它。
我应该如何从 class Lib 中将此 Action 称为对象自身?
非常感谢那些花时间处理它的人 ;)
编辑:这是一个最小的例子:
public class myObject {
int number;
public myObject() {
number = 0;
}
public void method1() {
Console.WriteLine("Bob is a great guy");
}
public void method2() {
number++;
}
public void method3() {
DoItForMe<myObject>(method2);
}
}
public class Lib {
public static void DoItForMe<T>(this T self, Action methodToExecute) {
self.methodtoExecute();
}
}
然后从主:
myObject bob = new myObject();
bob.method3();
Console.WriteLine("bob's number is" + bob.number);
应该给出输出
鲍勃的号码是 1
调用methodToExecute时必须不带self,因为这个方法是参数,不是self的方法
public static class Library
{
public static void DoStuffandCallMethod<T>(this T self, Action methodToExecute)
{
//DoStuff
methodToExecute();
}
}
DoStuffandCallMethod是你实例的扩展方法,你可以用this:
调用它
public class MyObject
{
private int number;
public int Number => number; // if you want to access from outside.
// ...
public void Method2()
{
number++;
}
public void Method3()
{
this.DoStuffandCallMethod(Method2);
}
}
您正在扩展每种类型。您可以从 int 中调用 DoStuffandCallMethod,...我觉得对于您的问题,接口是比扩展方法更好的方法。
我正在尝试编写一个函数库,供我项目中的所有 classes 使用(一个小的统一游戏)。可能已经有人问过这个问题,但我不确定要搜索什么并且还没有找到任何东西,所以我来了。 我想在库中创建一个函数,该函数接收一个委托参数(或者至少是一个 Action 类型的对象,不确定它是否真的称为委托)并运行它。问题是,此 Action 必须由另一种类型的对象调用并可能修改它(这意味着它必须由另一个对象调用)。我正在考虑为此使用通用扩展方法。 这是我现在的一些代码(虽然这段代码不起作用,但应该非常明确):
public static class Library
{
public static void doStuffandCallMethod<T>(this T self, Action methodToExecute) {
//DoStuff
self.methodToExecute();
}
}
这是我对这段代码进行概括的尝试:
public static void WaitAndDo( Action methodToExecute) {
//DoSuff();
methodToExecute();
}
效果很好。 但是,编译器不理解并在class T 中寻找一个名为methodToExecute 的方法,而不是用参数(Action)methodToExecute 描述的方法替换它。 我应该如何从 class Lib 中将此 Action 称为对象自身?
非常感谢那些花时间处理它的人 ;)
编辑:这是一个最小的例子:
public class myObject {
int number;
public myObject() {
number = 0;
}
public void method1() {
Console.WriteLine("Bob is a great guy");
}
public void method2() {
number++;
}
public void method3() {
DoItForMe<myObject>(method2);
}
}
public class Lib {
public static void DoItForMe<T>(this T self, Action methodToExecute) {
self.methodtoExecute();
}
}
然后从主:
myObject bob = new myObject();
bob.method3();
Console.WriteLine("bob's number is" + bob.number);
应该给出输出
鲍勃的号码是 1
调用methodToExecute时必须不带self,因为这个方法是参数,不是self的方法
public static class Library
{
public static void DoStuffandCallMethod<T>(this T self, Action methodToExecute)
{
//DoStuff
methodToExecute();
}
}
DoStuffandCallMethod是你实例的扩展方法,你可以用this:
调用它public class MyObject
{
private int number;
public int Number => number; // if you want to access from outside.
// ...
public void Method2()
{
number++;
}
public void Method3()
{
this.DoStuffandCallMethod(Method2);
}
}
您正在扩展每种类型。您可以从 int 中调用 DoStuffandCallMethod,...我觉得对于您的问题,接口是比扩展方法更好的方法。