当前位置: 首页>>代码示例>>C#>>正文


C# ParameterInfo.Zip方法代码示例

本文整理汇总了C#中System.Reflection.ParameterInfo.Zip方法的典型用法代码示例。如果您正苦于以下问题:C# ParameterInfo.Zip方法的具体用法?C# ParameterInfo.Zip怎么用?C# ParameterInfo.Zip使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在System.Reflection.ParameterInfo的用法示例。


在下文中一共展示了ParameterInfo.Zip方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。

示例1: EmitDynamicMethodInvokeBinder

        /// <summary>
        /// Emits the dynamic method invoke binder.
        /// </summary>
        /// <param name="generator">The generator.</param>
        /// <param name="flag">The binding flags.</param>
        /// <param name="name">The name.</param>
        /// <param name="context">The context.</param>
        /// <param name="argInfo">The arg info.</param>
        /// <param name="argNames">The arg names.</param>
        public static void EmitDynamicMethodInvokeBinder(this ILGenerator generator, CSharpBinderFlags flag, string name, IEnumerable<Type> genericParms, Type context, ParameterInfo[] argInfo, IEnumerable<string> argNames)
        {
            if (genericParms != null && !genericParms.Any())
                genericParms = null;

            generator.Emit(OpCodes.Ldc_I4, (int)flag);
            generator.Emit(OpCodes.Ldstr, name);
            if (genericParms == null)
            {
                generator.Emit(OpCodes.Ldnull);
            }
            else
            {
                generator.EmitArray(typeof(Type), genericParms.Select(arg => (Action<ILGenerator>)(gen => gen.EmitTypeOf(arg))).ToList());
            }
            generator.EmitTypeOf(context);
            var tList = new List<Action<ILGenerator>> { gen => gen.EmitCreateCSharpArgumentInfo(CSharpArgumentInfoFlags.None) };

           

            tList.AddRange(argInfo.Zip(argNames,(p,n)=>new{p,n}).Select(arg => (Action<ILGenerator>)(gen =>
                                                                            {
                                                                                var tStart = CSharpArgumentInfoFlags.
                                                                                    UseCompileTimeType;

                                                                                if (arg.p.IsDefined(typeof(DynamicAttribute), true))
                                                                                {
                                                                                    tStart = CSharpArgumentInfoFlags.None;
                                                                                }

                                                                                if (arg.p.IsOut)
                                                                                {
                                                                                    tStart |=
                                                                                        CSharpArgumentInfoFlags.IsOut;
                                                                                }
                                                                                else if(arg.p.ParameterType.IsByRef)
                                                                                {
                                                                                    tStart |=
                                                                                       CSharpArgumentInfoFlags.IsRef;
                                                                                }

                                                                                if (!String.IsNullOrEmpty(arg.n))
                                                                                {
                                                                                    tStart |=
                                                                                     CSharpArgumentInfoFlags.NamedArgument;
                                                                                }

                                                                                gen.EmitCreateCSharpArgumentInfo(tStart, arg.n);
                                                                                return;
                                                                            })));
            generator.EmitArray(typeof(CSharpArgumentInfo), tList);
            generator.Emit(OpCodes.Call, typeof(Binder).GetMethod("InvokeMember", new[] { typeof(CSharpBinderFlags), typeof(string), typeof(IEnumerable<Type>), typeof(Type), typeof(CSharpArgumentInfo[]) }));
        }
开发者ID:bbenzikry,项目名称:impromptu-interface,代码行数:62,代码来源:EmitExtensions.cs


注:本文中的System.Reflection.ParameterInfo.Zip方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。