gpt4 book ai didi

c# - 如何在运行时定义委托(delegate)类型(即动态委托(delegate)类型)

转载 作者:行者123 更新时间:2023-11-30 17:20:45 27 4
gpt4 key购买 nike

<分区>

为了即时创建委托(delegate),技术从 Delegate.CreateDelegate 到 Expresion Lambda、DynamicMethod 等等各不相同。所有这些技术都要求您知道委托(delegate)的类型。 p>

我正在尝试将封闭委托(delegate)一般转换为开放委托(delegate),为了实现这一点,我似乎需要在实际创建结果委托(delegate)之前动态创建开放委托(delegate)的类型.考虑:

pubic class WeakEvent<TDelegate> where TDelegate : class
{
public WeakEvent(Delegate aDelegate)
{
var dgt = aDelegate as TDelegate;

if(dgt == null)
throw new ArgumentException("aDelegate");

MethodInfo method = dgt.Method;
var parameters = Enumerable
.Repeat(dgt.Target.GetType(),1)
.Concat(method.GetParameters().Select(p => p.ParameterType));

Type openDelegateType = // ??? original delegate, with new 1st arg for @this

var dm = new DynamicMethod("InnerCode", method.ReturnType, parameters);

... your favourite IL code emmisions go here

var openDelegate = dm.CreateDelegate(openDelegateType);
}
}

上述代码的目的是创建一个与原始委托(delegate)相同的新委托(delegate),但this有一个新的第一个参数...即先前关闭的委托(delegate)的开放版本.

是否有一种简单的方法来克隆和修改现有的委托(delegate)类型,或者是否有最接近的解决方案来构建通用的 Func<> 和 Action<> 类型?

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