コード例 #1
0
ファイル: EventLister_T_.cs プロジェクト: sknchan/LegacyRust
    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]));
            }
        }
    }
コード例 #2
0
    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]);
            }
        }
    }