Как подписаться на событие с отражением.C # - PullRequest
0 голосов
/ 25 мая 2018

Кажется, я не могу понять, почему это выдает «Невозможно связать с целевым методом, потому что его подпись или прозрачность безопасности не совместима с таковой для типа делегата».В частности, эта часть method.CreateDelegate(eventInfos[0].EventHandlerType, new Commands());

//These are defined at the top of the class
public delegate Task MessageReceivedAsyncDelegate(SocketMessage arg);
public delegate void MessageReceivedDelegate(SocketMessage arg);
public event MessageReceivedAsyncDelegate MessageReceivedCommandAsync;
public event MessageReceivedDelegate MessageReceivedCommand;
//These are defined at the top of the class


    Type B = typeof(Base);
    Type C = typeof(Commands);
    MethodInfo[] methods = C.GetMethods();
    foreach (MethodInfo method in methods)
    {
        EventInfo[] eventInfos = B.GetEvents();
        if(method.GetCustomAttributes(typeof(SubscribeToMessageRecivedAttribute)).Any()
        {
            if (method.ReturnType == typeof(Task))
            {
                try { eventInfos[0].AddEventHandler(C, method.CreateDelegate(eventInfos[0].EventHandlerType, new Commands())); }
                catch(Exception exception) { Console.WriteLine(exception); }
            }
            else eventInfos[1].AddEventHandler(C, method.CreateDelegate(eventInfos[1].EventHandlerType, new Commands()));
        }
    }

Метод, который пытается добавить

  public partial class Commands : ModuleBase<SocketCommandContext>
    {
        [SubscribeToMessageRecived]
        public static async Task Mock(SocketMessage arg)
        {
            Console.WriteLine("Mocking");
            if (Base.mockList.Contains((int)arg.Author.Id))
            {
                char[] msgArray = arg.Content.ToCharArray();
                for (int i = 0; i < arg.Content.Length; i++)
                {
                    if (DaMef.RandomRange(0,3) == 1) msgArray[i] = msgArray[i].ToString().ToLower().ToCharArray()[0];
                    else msgArray[i] = msgArray[i].ToString().ToUpper().ToCharArray()[0];
                }

            string finalString = msgArray.ToString();
            await arg.Channel.SendMessageAsync(finalString + "\nhttps://imgur.com/a/HsiBmYc");
            }
        }
    }

Я пытаюсь подписать все методы в командах с «SubscribeToMessageRecivedAttribute» на событие.

В Интернете есть ответы, но, похоже, нет.(Или, может быть, я просто не понял их.) Я никогда не использовал отражения и едва использовал события, так что извините, если это что-то глупое.

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