예제 #1
0
        private static MemberInfoNode GetStructTree(Type t)
        {
            if (t == null)
            {
                throw new ArgumentNullException("t");
            }

            var ti = t.GetTypeInfo();

            if (ti.IsClass || ti.IsGenericType || ti.IsInterface || ti.IsPrimitive || ti.IsEnum)
            {
                throw new ArgumentException("Only struct are allowed");
            }
            var memberTree = new MemberInfoNode();
            var offset     = 0;

            var isExplicitLayout = !ti.IsAutoLayout || ti.IsExplicitLayout;

            foreach (var fieldInfo in ti.DeclaredFields)
            {
                var childInfo = new MemberInfoNode();
                childInfo.FieldName = fieldInfo.Name;
                childInfo.FieldType = fieldInfo.FieldType;
                if (fieldInfo.IsStatic)
                {
                    throw new InvalidOperationException("Struct type must not contain static fields " + fieldInfo.Name);
                }
                else if (isExplicitLayout)
                {
                    // get fieldOffset
                    var foa = fieldInfo.GetCustomAttribute <FieldOffsetAttribute>(true);
                    if (foa == null)
                    {
                        throw new InvalidOperationException("FieldOffsetAttribute has to be declared on struct type with layout explicit");
                    }
                    var fieldOffset = foa.Value;
                    childInfo.Offset = fieldOffset;
                    childInfo.Size   = SizeOf(fieldInfo.FieldType);
                    memberTree.Children.Add(childInfo);
                }
                else
                {
                    var size = SizeOf(fieldInfo.FieldType);
                    childInfo.Offset = offset;
                    childInfo.Size   = size;
                    memberTree.Children.Add(childInfo);
                    offset += size;
                }
            }

            return(memberTree);
        }
예제 #2
0
        public MemberExpressionNode(MemberExpression expression, Container container) : base(expression, container)//, [Optional]IExpressionParser parser) : base(expression, parser)
        {
            var expressionParser = container.GetInstance <IExpressionParser>();
            var memberInfoParser = container.GetInstance <IMemberInfoParser>();

            if (expression.Expression is ConstantExpression)
            //if (typeof(Derived).IsSubclassOf(typeof(SomeType)))
            {
                object underlyingValue = ((ConstantExpression)expression.Expression).Value;
                var    member          = expression.Member;
                if (member is FieldInfo)
                {
                    object value = ((FieldInfo)member).GetValue(underlyingValue);
                    MExpression = expressionParser.Parse(Expression.Constant(value));

                    Member = memberInfoParser.Parse(value.GetType().GetField(((FieldInfo)member).Name));
                }
                if (member is PropertyInfo)
                {
                    object value = ((PropertyInfo)member).GetValue(underlyingValue, null);
                    MExpression = expressionParser.Parse(Expression.Constant(value));

                    Member = memberInfoParser.Parse(value.GetType().GetField(((PropertyInfo)member).Name));
                }
            }
            else
            {
                MExpression = expressionParser.Parse(expression.Expression);
                Member      = memberInfoParser.Parse(expression.Member);
            }


            /*
             * MExpression = expressionParser.Parse(expression.Expression);
             * Member = memberInfoParser.Parse(expression.Member);
             */
        }
예제 #3
0
 protected MemberBindingNode(NodeContext factory, MemberBindingType bindingType, MemberInfo memberInfo) : base(factory)
 {
     BindingType = bindingType;
     Member = new MemberInfoNode(Context, memberInfo);
 }