Невозможно создать делегат из универсального производного события в универсальный метод другого класса - PullRequest
0 голосов
/ 03 июня 2018

Ладно, друзья, у меня следующая проблема:

Я хочу подключить события универсальных производных классов к универсальному методу не универсального мастер-класса.

Проблема в том, что она говорит мнеподписи не помещаются:

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 голосов
/ 03 июня 2018

Хорошо, я понял ^^

Мне пришлось ввести тип в общий методInfo.

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

до

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

Тем не менее, если кто-нибудь знает, какнастроить контейнер в этой разметке, это было бы здорово.Дайте мне знать в комментариях, хаха

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...