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); }
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); */ }
protected MemberBindingNode(NodeContext factory, MemberBindingType bindingType, MemberInfo memberInfo) : base(factory) { BindingType = bindingType; Member = new MemberInfoNode(Context, memberInfo); }