private List <ReactEventInfo> InitEventInfos()
        {
            var result = new List <ReactEventInfo>();

            foreach (var propertyInfo in ModuleType.GetProperties())
            {
                var eventAttribute = propertyInfo.GetCustomAttribute <ReactEventAttribute>();
                if (eventAttribute != null)
                {
                    var eventInfo = new ReactEventInfo(propertyInfo, eventAttribute);
                    result.Add(eventInfo);
                }
            }

            return(result);
        }
        private Delegate MakeEventDelegate(string eventName, Type memberType, Type eventDataType)
        {
            //
            // (TFrameworkElement view, TEventData eventData) =>
            // {
            //   ReactContext.DispatchEvent(view, eventName, ReactEventHelpers.ArgWriter(eventData));
            // };
            //

            ParameterExpression viewParameter      = Expression.Parameter(typeof(TFrameworkElement), "view");
            ParameterExpression eventDataParameter = Expression.Parameter(eventDataType, "eventData");

            MemberExpression     thisReactContext = Expression.Property(Expression.Constant(this), "ReactContext");
            MethodCallExpression dispatchCall     = Expression.Call(thisReactContext, typeof(IReactContext).GetMethod("DispatchEvent"), viewParameter, Expression.Constant(eventName, typeof(string)), Expression.Call(ReactEventInfo.ArgWriterOf(eventDataType), eventDataParameter));

            return(Expression.Lambda(memberType, dispatchCall, viewParameter, eventDataParameter).Compile());
        }