gpt4 book ai didi

C# 成员方法作为静态方法 ("reversed extension method")

转载 作者:行者123 更新时间:2023-11-30 19:15:24 24 4
gpt4 key购买 nike

在 C# 中是否可以在不指定对象的情况下获取对成员函数的引用,以便它可以像静态扩展方法一样使用,将对象作为第一个参数?

class Handler
{
public void Add(int value) { ... }
}

static class HandlerExtensions
{
public static void AddEx(this Handler instance, int value) { ... }
}


var x = new Handler();

// possible:
Action<int> func1 = x.Add;
Action<Handler, int> func2 = HandlerExtensions.AddEx;

// not possible?
Action<Handler, int> func3 = Handler::Add;

我为什么要这样做?在使用实际对象之前指定要在类中调用的方法:

// current solution:
void RegisterDto<DataType>(Func<Handler, Action<DataType>> handler) { ... }
RegisterDto<int>(x => x.Add);

// desired solution:
void RegisterDto<DataType>(Action<Handler, DataType> handler) { ... }
RegisterDto<int>(Handler::Add); // <--- does syntax for this exist?

最佳答案

如果您的意思是“您可以创建这样的委托(delegate)”,那么答案是“可以,但它有点难看”。我认为您不能使用方法组转换,但您可以使用反射和 Delegate.CreateDelegate,例如

MethodInfo method = typeof(Handler).GetMethod("Add");
var action = (Action<Handler, int>)
Delegate.CreateDelegate(typeof(Action<Handler, int>), method);

如果在这里有一个方法组转换会很好,我同意。

关于C# 成员方法作为静态方法 ("reversed extension method"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39363670/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com