示例#1
0
 public ProtoColumn(
     PropertyInfo propertyInfo,
     string name,
     short id,
     IProtoValue <V> valueMetadata,
     // Expression defaultExpression,
     V defaultValue,
     Func <T, V> getter,
     Action <T, V> setter)
 {
     this.PropertyInfo  = propertyInfo;
     this.Name          = name;
     this.ID            = id;
     this.ValueMetadata = valueMetadata;
     // this.DefaultExpression = defaultExpression;
     // this.Default = Expression.Lambda<Func<V>>(defaultExpression).Compile().Invoke();
     this.Default = defaultValue;
     this.Getter  = getter;
     this.Setter  = setter;
 }
示例#2
0
文件: ListValue.cs 项目: xgray/dotnet
 public ListValue(IProtoValue <V> valueMetadata)
 {
     this.ValueMetadata = valueMetadata;
 }
示例#3
0
 public ArrayValue(IProtoValue <V> valueMetadata)
 {
     this.ValueMetadata = valueMetadata;
 }
示例#4
0
文件: MapValue.cs 项目: xgray/dotnet
 public MapValue(IProtoValue <K> keyMetadata, IProtoValue <V> valueMetadata)
 {
     this.KeyMetadata   = keyMetadata;
     this.ValueMetadata = valueMetadata;
 }
示例#5
0
文件: Proto.cs 项目: xgray/dotnet
        private static IProtoValue CreateProtoValue(Type type)
        {
            if (type == typeof(string))
            {
                return(new StringValue());
            }
            else if (type == typeof(bool))
            {
                return(new BooleanValue());
            }
            else if (type == typeof(byte))
            {
                return(new ByteValue());
            }
            else if (type == typeof(short))
            {
                return(new Int16Value());
            }
            else if (type == typeof(ushort))
            {
                return(new UInt16Value());
            }
            else if (type == typeof(int))
            {
                return(new Int32Value());
            }
            else if (type == typeof(uint))
            {
                return(new UInt32Value());
            }
            else if (type == typeof(long))
            {
                return(new Int64Value());
            }
            else if (type == typeof(ulong))
            {
                return(new UInt64Value());
            }
            else if (type == typeof(double))
            {
                return(new DoubleValue());
            }
            else if (type == typeof(DateTime))
            {
                return(new DateTimeValue());
            }
            else if (type == typeof(TimeSpan))
            {
                return(new TimeSpanValue());
            }
            else if (type == typeof(Guid))
            {
                return(new GuidValue());
            }
            else if (type == typeof(byte[]))
            {
                return(new BinaryValue());
            }
            else if (type.IsArray)
            {
                Type        elementType     = type.GetElementType();
                IProtoValue elementMetadata = Proto <T> .CreateProtoValue(elementType);

                Type genericDef = typeof(ArrayValue <int>).GetGenericTypeDefinition();
                Type target     = genericDef.MakeGenericType(elementType);
                return((IProtoValue)Activator.CreateInstance(target, elementMetadata));
            }
            else if (type.GetTypeInfo().IsGenericType &&
                     type.GetGenericTypeDefinition() == typeof(List <int>).GetGenericTypeDefinition())
            {
                Type        elementType     = type.GetGenericArguments()[0];
                IProtoValue elementMetadata = Proto <T> .CreateProtoValue(elementType);

                Type genericDef = typeof(ListValue <int>).GetGenericTypeDefinition();
                Type target     = genericDef.MakeGenericType(elementType);
                return((IProtoValue)Activator.CreateInstance(target, elementMetadata));
            }
            else if (type.GetTypeInfo().IsGenericType &&
                     type.GetGenericTypeDefinition() == typeof(HashSet <int>).GetGenericTypeDefinition())
            {
                Type        elementType     = type.GetGenericArguments()[0];
                IProtoValue elementMetadata = Proto <T> .CreateProtoValue(elementType);

                Type genericDef = typeof(SetValue <int>).GetGenericTypeDefinition();
                Type target     = genericDef.MakeGenericType(elementType);
                return((IProtoValue)Activator.CreateInstance(target, elementMetadata));
            }
            else if (type.GetTypeInfo().IsGenericType &&
                     type.GetGenericTypeDefinition() == typeof(Dictionary <int, int>).GetGenericTypeDefinition())
            {
                Type        keyType     = type.GetGenericArguments()[0];
                IProtoValue keyMetadata = Proto <T> .CreateProtoValue(keyType);

                Type        elementType     = type.GetGenericArguments()[1];
                IProtoValue elementMetadata = Proto <T> .CreateProtoValue(elementType);

                Type genericDef = typeof(MapValue <int, int>).GetGenericTypeDefinition();
                Type target     = genericDef.MakeGenericType(keyType, elementType);
                return((IProtoValue)Activator.CreateInstance(target, keyMetadata, elementMetadata));
            }
            else if (type.HasCustomAttribute <ProtoAttribute>())
            {
                Type genericDef = typeof(StructValue <T>).GetGenericTypeDefinition();
                Type target     = genericDef.MakeGenericType(type);
                return((IProtoValue)Activator.CreateInstance(target));
            }
            else
            {
                throw new ProtoException(ProtoErrorCode.InvalidArgument, "failed to create proto column for type {0}", type);
            }
        }
示例#6
0
文件: Proto.cs 项目: xgray/dotnet
        private static IProtoColumn <T> CreateProtoColumn(PropertyInfo propInfo)
        {
            Type type         = typeof(T);
            Type propertyType = propInfo.PropertyType;


            LambdaExpression getter = null;
            LambdaExpression setter = null;

            Expression defaultExpr = Expression.Default(propertyType);

            Type getterType = typeof(Func <T, int>)
                              .GetGenericTypeDefinition()
                              .MakeGenericType(typeof(T), propertyType);

            Type setterType = typeof(Action <T, int>)
                              .GetGenericTypeDefinition()
                              .MakeGenericType(typeof(T), propertyType);

            if (propInfo.CanRead)
            {
                ParameterExpression objectParameter = Expression.Parameter(type);
                Expression          propertyExpr    = Expression.Property(objectParameter, propInfo);
                getter = Expression.Lambda(getterType, propertyExpr, objectParameter);
            }
            else
            {
                // return default value if the property has no getter method.
                ParameterExpression objectParameter = Expression.Parameter(type);
                getter = Expression.Lambda(getterType, defaultExpr, objectParameter);
            }

            if (propInfo.CanWrite)
            {
                ParameterExpression objectParameter = Expression.Parameter(type);
                ParameterExpression valueParameter  = Expression.Parameter(propertyType);
                Expression          propertyExpr    = Expression.Property(objectParameter, propInfo);
                Expression          assignExpr      = Expression.Assign(propertyExpr, valueParameter);
                setter = Expression.Lambda(setterType, assignExpr, objectParameter, valueParameter);
            }
            else
            {
                ParameterExpression objectParameter = Expression.Parameter(type);
                ParameterExpression valueParameter  = Expression.Parameter(propertyType);
                Expression          emptyExpr       = Expression.Empty();
                setter = Expression.Lambda(setterType, emptyExpr, objectParameter, valueParameter);
            }

            ProtoColumnAttribute protoColumnAttribute = propInfo.GetCustomAttribute <ProtoColumnAttribute>();
            IProtoValue          valueMetadata        = Proto <T> .CreateProtoValue(propertyType);

            Type genericDef = typeof(ProtoColumn <T, int>).GetGenericTypeDefinition();
            Type target     = genericDef.MakeGenericType(typeof(T), propertyType);

            ConstructorInfo constructorInfo = target.GetConstructors()[0];

            return((IProtoColumn <T>)constructorInfo.Invoke(
                       new object[]
            {
                propInfo,
                propInfo.Name,
                protoColumnAttribute.ID,
                valueMetadata,
                Expression.Lambda(defaultExpr).Compile().DynamicInvoke(),
                getter.Compile(),
                setter.Compile()
            }
                       ));
        }