无法从泛型派生事件创建委托到另一个类的泛型方法

时间:2018-06-03 12:55:53

标签: c# generics events reflection delegates

好朋友,我有以下问题:

我想将泛型派生类的事件挂钩到非泛型主类'通用方法。

问题是,它告诉我签名不合适:

ArgumentException:无法绑定到目标方法,因为其签名与委托类型的签名不同

这里有一些日志:

  • 当事件是委托时:Denis<T1>() where T1 : IFieldUpdater;

    handlerType: _FieldUpdater`1+Denis`1[IFieldUpdater,IFieldUpdater]
    methodInfo: Void UpdateSubscribers[T2]()
    
  • 当事件是委托时:Denis()

    handlerType: _FieldUpdater`1+Denis[IFieldUpdater]
    methodInfo: Void UpdateSubscribers[T2]()
    

如果我知道如何在这里制作可扩展/可折叠的盒子,那就太棒了,所以我可以放入相关的行:

public static class FieldUpdateMaster
{

    private static void HookUpdaters()
    {
        Type updater = typeof(_FieldUpdater<IFieldUpdater>);
        object instance = updater.GetProperty(nameof(_FieldUpdater<IFieldUpdater>.Instance),
                BindingFlags.FlattenHierarchy |
                BindingFlags.Static |
                BindingFlags.Public)
            ?.GetValue(null); // get static Singleton Instance

        EventInfo eventInfo = updater.GetEvent(nameof(_FieldUpdater<IFieldUpdater>.UpdateSubscribers));

        MethodInfo methodInfo = typeof(FieldUpdateMaster).GetMethod(nameof(UpdateSubscribers),
            BindingFlags.NonPublic | BindingFlags.Static);

            Debug.Log($"handlerType: {eventInfo.EventHandlerType}\n" +
                      $"methodInfo: {methodInfo}");
        Delegate del = Delegate.CreateDelegate(eventInfo.EventHandlerType, methodInfo);
        eventInfo.AddMethod.Invoke(instance, new object[] {del});
    }

    private static void UpdateSubscribers<T2>() where T2 : IFieldUpdater{...}
}

//_AbstractSingleton creates an Instance of the First SubType of _FieldUpdater<T>
public abstract class _FieldUpdater<T> : _AbstractSingleton<_FieldUpdater<T>> where T : IFieldUpdater
{   
    protected internal abstract Type[] Types { get; }

    public event Action OnFieldUpdate;

    public delegate void Denis<T1>() where T1 : IFieldUpdater;

    public event Denis<T> UpdateSubscribers;
}

事情是我完全不知道现在该做什么。 HELP ^^

1 个答案:

答案 0 :(得分:0)

好吧,我明白了^^

我不得不将一个Type引入泛型methodInfo。

Delegate del = Delegate.CreateDelegate(eventInfo.EventHandlerType, methodInfo);

Delegate del = Delegate.CreateDelegate(eventInfo.EventHandlerType, methodInfo.MakeGenericMethod(eventInfo.EventHandlerType.GenericTypeArguments[0]));

如果我们知道如何在此标记中设置容器,那就太棒了。请在评论中告诉我,哈哈