static EventLister() { if (!typeof(T).IsSubclassOf(typeof(Delegate))) { throw new InvalidOperationException("T is not a delegate"); } EventListerInvokeAttribute customAttribute = (EventListerInvokeAttribute)Attribute.GetCustomAttribute(typeof(T), typeof(EventListerInvokeAttribute), false); EventLister <T> .InvokeCallType = customAttribute.InvokeCall; EventLister <T> .CalleeType = customAttribute.InvokeClass; MethodInfo method = EventLister <T> .InvokeCallType.GetMethod("Invoke"); ParameterInfo[] parameters = method.GetParameters(); Type[] parameterType = new Type[(int)parameters.Length]; for (int i = 0; i < (int)parameters.Length; i++) { parameterType[i] = parameters[i].ParameterType; } EventLister <T> .CalleeMethod = EventLister <T> .CalleeType.GetMethod(customAttribute.InvokeMember, BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic, null, method.CallingConvention, parameterType, null); ParameterInfo[] parameterInfoArray = EventLister <T> .CalleeMethod.GetParameters(); for (int j = 0; j < (int)parameterInfoArray.Length; j++) { if ((parameterInfoArray[j].Attributes & parameters[j].Attributes) != parameters[j].Attributes) { throw new InvalidOperationException(string.Concat("Parameter does not match the InvokeCall ", parameterInfoArray[j])); } } }
static EventLister() { if (!typeof(T).IsSubclassOf(typeof(Delegate))) { throw new InvalidOperationException("T is not a delegate"); } EventListerInvokeAttribute attribute = (EventListerInvokeAttribute)Attribute.GetCustomAttribute(typeof(T), typeof(EventListerInvokeAttribute), false); EventLister <T> .InvokeCallType = attribute.InvokeCall; EventLister <T> .CalleeType = attribute.InvokeClass; MethodInfo method = EventLister <T> .InvokeCallType.GetMethod("Invoke"); ParameterInfo[] parameters = method.GetParameters(); System.Type[] types = new System.Type[parameters.Length]; for (int i = 0; i < parameters.Length; i++) { types[i] = parameters[i].ParameterType; } EventLister <T> .CalleeMethod = EventLister <T> .CalleeType.GetMethod(attribute.InvokeMember, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static, null, method.CallingConvention, types, null); ParameterInfo[] infoArray2 = EventLister <T> .CalleeMethod.GetParameters(); for (int j = 0; j < infoArray2.Length; j++) { if ((infoArray2[j].Attributes & parameters[j].Attributes) != parameters[j].Attributes) { throw new InvalidOperationException("Parameter does not match the InvokeCall " + infoArray2[j]); } } }