成员访问的解析稍微有点复杂,从字符串角度看,访问一个实例的成员有三种形式:
访问成员字段或属性 instance.field instance.property
访问索引器 instance[]
访问方法 instance.method(...)
在解析的时候就按这三种形式进行解析,目前由于grammar修改的不完美所以还不支持显示进行泛型方法的调用。
private Expression ProcessMemberAccessExpression(ParseTreeNode expNode)
{
Expression self = null;
ParseTreeNode args;
List<Expression> arglist;
var identifier = expNode.GetDescendant("Identifier");
var members = expNode.LastChild;
var variableName = identifier.GetValue();
var parameter = _parameters.Count > 0 ? _parameters.Peek().FirstOrDefault(p => p.Name == variableName) : null;
if (parameter != null)
{
self = parameter;
}
else
{
var pair = _knownVariables.FirstOrDefault(p => p.Key == variableName);
if (pair.Key == variableName)
{
self = Expression.Constant(pair.Value);
//self = Expression.Variable(pair.Value.GetType(), variableName);
}
else if (_parameters.Count > 0)
{
var parameters = _parameters.Peek();
var usedParameter = parameters.FirstOrDefault(p => p.Type.GetMember(variableName).Length > 0);
if (usedParameter != null)
self = Expression.MakeMemberAccess(usedParameter, usedParameter.Type.GetMember(variableName).First());
}
if (self == null)
{
throw new Exception(variableName);
}
}
if (members.ChildNodes.Count == 0)
{
return self;
}
foreach (var child in members.ChildNodes)
{
v

本文详细阐述了在解析lambda表达式时,如何处理成员访问,包括字段、属性、索引器和方法的访问。成员访问分为三类:字段/属性访问、索引器访问和方法调用。在解析过程中,成员作为子节点处理,实例则通过预定义变量和参数获取。文章还讨论了如何处理泛型方法,以及当标准方法找不到时,如何识别并调用扩展方法。MakeMethod方法用于根据方法名和泛型列表找到特定的扩展方法,尤其在处理LINQ的泛型扩展方法时显得尤为重要。然而,目前实现中存在一个问题,即如何获取如Func<T1, IEnumerable<T2>, T3>这类复杂泛型类型的类型信息。"
132938219,20036732,jQuery快速入门与实战指南,"['jQuery', '前端开发', 'JavaScript']
最低0.47元/天 解锁文章
1184

被折叠的 条评论
为什么被折叠?



