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


C# Candidate.Clone方法代码示例

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


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

示例1: InferTypeArguments

 private Candidate InferTypeArguments(Candidate candidate, IDictionary<Type, Type> typeArgumentMap, SymbolTable symbols)
 {
     return this.DispatchType != DispatchTypes.Method
         ? candidate
         : new Dictionary<Type, Type>(typeArgumentMap).Let(map =>
           {
               if (map.Count == candidate.Method.GetGenericArguments().Length)
               {
                   return candidate.Clone(
                       member: candidate.Method != null && candidate.Method.IsGenericMethodDefinition
                           ? candidate.Method.MakeGenericMethod(typeArgumentMap.ToArgumentArray())
                           : candidate.Member,
                       arguments: candidate.ParameterMap
                           .Select(_ => _.Item2 is AmbiguousLambdaExpression && _.Item1.GetDelegateSignature() != null
                               ? ((AmbiguousLambdaExpression) _.Item2)
                                     .ApplyTypeArguments(_.Item1)
                                     .ApplyTypeArguments(map)
                                     .Reduce(symbols, _.Item1.ReplaceGenericArguments(map))
                               : _.Item2
                           )
                           .ToArray()
                   );
               }
               else
               {
                   candidate.ParameterMap
                       .Where(_ => !(_.Item1.IsGenericParameter
                           ? EnumerableEx.Return(_.Item1)
                           : _.Item1.GetGenericArguments()
                       ).All(map.ContainsKey))
                       .ForEach(_ =>
                       {
                           if (_.Item1.GetDelegateSignature() != null)
                           {
                               if (_.Item2 is AmbiguousLambdaExpression)
                               {
                                   var method = _.Item1.GetDelegateSignature();
                                   if (!method.ReturnType.Let(r =>
                                       (r.IsGenericParameter ? new [] { r, } : r.GetGenericArguments()).Let(ts => ts.All(map.ContainsKey))
                                   ))
                                   {
                                       method.GetParameters()
                                           .Select(p => p.ParameterType.Let(t => t.IsGenericParameter
                                               ? map.GetValue(t)
                                               : t
                                           ))
                                           .If(ts => ts.All(t => t != null), ts =>
                                               map = new TypeNode(method.ReturnType).Match(map, ((AmbiguousLambdaExpression) _.Item2)
                                                   .ApplyTypeArguments(ts)
                                                   .Type(symbols)
                                                   .GetDelegateSignature()
                                                   .ReturnType
                                               )
                                           );
                                   }
                               }
                               else if (_.Item2 is LambdaExpression)
                               {
                                   map = new TypeNode(_.Item1).Match(map, _.Item2.Type.GetDelegateSignature().GetDelegateType());
                               }
                           }
                           else if (_.Item1.ContainsGenericParameters)
                           {
                               (_.Item1.IsGenericParameter
                                   ? EnumerableEx.Return(Tuple.Create(_.Item1, _.Item2.Type))
                                   : _.Item1.GetAppearingTypes()
                                         .Zip(_.Item2.Type.GetCorrespondingType(_.Item1).GetAppearingTypes(), Tuple.Create)
                                         .Where(t => t.Item1.IsGenericParameter)
                               ).ForEach(t => map = new TypeNode(t.Item1).Match(map, t.Item2));
                           }
                       });
                   return map.Keys.All(typeArgumentMap.ContainsKey)
                       ? null
                       : this.InferTypeArguments(candidate, map, symbols);
             }
           });
 }
开发者ID:takeshik,项目名称:yacq,代码行数:77,代码来源:DispatchExpression.cs


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