本文整理汇总了C#中ExpressionSyntax.Skip方法的典型用法代码示例。如果您正苦于以下问题:C# ExpressionSyntax.Skip方法的具体用法?C# ExpressionSyntax.Skip怎么用?C# ExpressionSyntax.Skip使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类ExpressionSyntax
的用法示例。
在下文中一共展示了ExpressionSyntax.Skip方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: TryUnwrapJsniExpression
public bool TryUnwrapJsniExpression(IMethodSymbol method, ExpressionSyntax originalTarget, ExpressionSyntax[] originalArguments, JsExpression target, JsExpression[] arguments, out JsExpression result)
{
// Special compiler handler of Jsni -- these are special methods that translate into otherwise inexpressible javascript
if (Equals(method.ContainingType, Context.Instance.JsniType))
{
if (method.ReducedFrom != null && !Equals(method.ReducedFrom, method))
{
method = method.ReducedFrom;
arguments = new[] { target }.Concat(arguments).ToArray();
originalArguments = new[] { originalTarget }.Concat(originalArguments).ToArray();
}
switch (method.Name)
{
case "apply":
{
if (method.TypeArguments.Any())
{
// First argument is an Action -- we want to deconstruct it to extract the target and method name.
var body = originalArguments[0].GetBody();
var lambdaInvocation = (InvocationExpressionSyntax)body;
var lambdaMethod = (IMethodSymbol)ModelExtensions.GetSymbolInfo(transformer.model, lambdaInvocation).Symbol;
result = Type(lambdaMethod.ContainingType).Member("prototype").Member(lambdaMethod.GetMemberName()).Member("apply").Invoke(arguments[1], arguments[2]);
return true;
}
else
{
result = arguments[0].Member("apply").Invoke(arguments[1], arguments[2]);
return true;
}
}
case "call":
{
if (method.TypeArguments.Any())
{
// First argument is an Action -- we want to deconstruct it to extract the target and method name.
var body = originalArguments[0].GetBody();
var lambdaInvocation = (InvocationExpressionSyntax)body;
var lambdaMethod = (IMethodSymbol)ModelExtensions.GetSymbolInfo(transformer.model, lambdaInvocation).Symbol;
result = Type(lambdaMethod.ContainingType).Member("prototype").Member(lambdaMethod.GetMemberName()).Member("call").Invoke(arguments.Skip(1).ToArray());
return true;
}
else
{
// First argument is an Action -- we want to deconstruct it to extract the target and method name.
result = arguments[0].Member("call").Invoke(arguments.Skip(1).ToArray());
return true;
}
}
case "type":
result = method.TypeArguments.Any() ?
Type(method.TypeArguments.Single()) :
((JsMemberReferenceExpression)((JsInvocationExpression)arguments[0]).Target).Target;
return true;
case "new":
case "@new":
result = Js.New(arguments[0].Parenthetical(), arguments.Skip(1).ToArray());
return true;
case "array":
result = Js.Array(arguments);
return true;
case "invoke":
result = arguments[0].Invoke(arguments.Skip(1).ToArray());
return true;
case "memberset":
{
var memberName = GetConstantString(originalArguments[1]);
result = arguments[0].Member(memberName).Assign(arguments[2]);
return true;
}
case "member":
{
var memberName = GetConstantString(originalArguments[1]);
result = arguments[0].Member(memberName);
return true;
}
case "function":
case "procedure":
var nameArguments = originalArguments.Skip(1).ToArray();
var nameOverrides = nameArguments.Select(x => GetConstantString(x)).ToArray();
var lambda = originalArguments[0];
var lambdaSymbol = (IMethodSymbol)transformer.model.GetSymbolInfo(lambda).Symbol;
var lambdaParameters = lambda.GetParameters();
var jsParameters = lambdaParameters.Select(x => Js.Parameter(x.Identifier.ToString())).Cast<IJsDeclaration>().ToArray();
for (var i = 0; i < nameOverrides.Length; i++)
{
jsParameters[i] = new WrappedParent(jsParameters[i]) { Name = nameOverrides[i] };
}
for (var i = 0; i < jsParameters.Length; i++)
{
var parameter = jsParameters[i];
var symbol = lambdaSymbol.Parameters[i];
transformer.DeclareInCurrentScope(symbol, parameter);
}
var jsBody = new JsBlockStatement();
transformer.PushOutput(jsBody);
var lambdaBody = lambda.GetBody();
//.........这里部分代码省略.........