成员访问的解析稍微有点复杂,从字符串角度看,访问一个实例的成员有三种形式:
访问成员字段或属性 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)
{