Как я могу получить ценность от IDictionary в вызове VisitMember? - PullRequest
0 голосов
/ 29 мая 2020

Я хочу получить свойство от IDictionry

Я хочу получить к нему доступ при вызове VisitMember

Но когда я его запустил

Кажется, что значение словаря не возвращается

Потому что, когда я пытаюсь преобразовать, как здесь:

var dictProperty = declProp as IDictionary<string, object>;

, он возвращает null (но имеет тип IDictionary)

В чем проблема?

 protected override Expression VisitMember(MemberExpression node)
            {


                if ((node.Member as PropertyInfo) != null)
                {
                   //this line returns propety  IDictionary<string,object> of my object which Type 
                   //I can get from node.Member.DeclaringType)
                    var declProp = node.Member.DeclaringType.GetProperty(node.Member.Name);
                    ///trying to get to dictionary Item and return value
                    var parameterExpression = Expression.Parameter(typeof(IDictionary<string, 
                    object>), "dict");
                    var constant = Expression.Constant("ContentType");
                    var propertyGetter = Expression.Property(parameterExpression, "Item", constant);
                    var expr = Expression.Lambda<Func<IDictionary<string, object>, object>>(propertyGetter, parameterExpression).Compile();
                    //but  dictProperty is null
                    //and it seems there is no value
                    var dictProperty = declProp as IDictionary<string, object>;
                    var value = expr(dictProperty);//trick to get value from dict

                }
                else if ((node.Member as FieldInfo) != null)
                {
                    var fieldInfo = node.Member as FieldInfo;
                    var constantExpression = node.Expression as ConstantExpression;
                    if (fieldInfo != null & constantExpression != null)
                    {
                       var value = fieldInfo.GetValue(constantExpression.Value);
                    }
                }
                else
                {
                    throw new Exception();
                }
                Expression mappedMember;
                if (map.memberMap.TryGetValue(node.Member, out mappedMember))
                    return Visit(mappedMember);
                return Expression.PropertyOrField(expression, node.Member.Name);
            }
...