gpt4 book ai didi

c# - 如何动态推断 Action 的类型?

转载 作者:太空宇宙 更新时间:2023-11-03 13:33:57 25 4
gpt4 key购买 nike

我有一个字典如下:

var composEvents = new Dictionary<Type, Delegate>
{
{
typeof (GetWorkflowAnalysisDealLevelViewDataCompletedEvent),
new Action<bool>(GetWorkflowAnalysisDealLevelViewDataCompleted)
},{
typeof (NoDataReturnedEvent),
new Action<NoDataReturnedParameters>(NoDataReturned)
}
};

然后我订阅不同的事件,将 Action 作为回调传递,但是因为每个事件的每个 Action 的类型都不同,即:

 Action<bool>
Action<NoDataReturnedParameters>

如何在不显式转换操作类型的情况下动态生成以下代码?

foreach (var cEvent in composEvents)
{
var method = typeof(IEventAggregator).GetMethod("GetEvent", BindingFlags.Public | BindingFlags.Instance);
var generic = method.MakeGenericMethod(cEvent.Key);
dynamic evt = generic.Invoke(_eventAggregator, null);
var cancelationToken = evt.Subscribe((Action<bool>)cEvent.Value);
_compositeEvents.Add(evt, cancelationToken);
}

最佳答案

我相信以下将达到您的预期结果:

public abstract class Base 
{
public abstract void Assign ( object value );
}

public class Assigner<EventType, ActionType>: Base
{
public override void Assign ( object value )
{
AssignAction((ActionType)value);
}

private void AssignAction ( ActionType action )
{
var event = _eventAggregator.GetEvent<EventType>();
var token = event.Subscribe(action);
_compositeEvents.Add(event, token);
}
}

其他地方:

foreach (var cEvent in composEvents)
{
var genericType = typeof(Assigner<,>).MakeGenericType(cEvent.Key, cEvent.Value.GetType());
var assignerInstance = (Base)Activator.CreateInstance(genericType);
assignerInstance.Assign(cEvent.Value);
}

请注意,我在这里直接输入了所有代码,因此可能存在语法错误、拼写错误和意外误导。

我相信这会奏效,如果行不通:请随时告诉我。

Assigner 类型正在使用它无法访问(最有可能)的 _compositeEvents 和 _eventAggregator,因此您需要将它们传递给构造函数或使它们可访问来自某处。

您需要为泛型类型参数添加一些约束,因为 GetEvent() 有它们,但希望这些会相对明显。

关于c# - 如何动态推断 Action<T> 的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19384489/

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