static Verifyer() { if (attribute != null && custom == null && Fields != null) { LeftArray <Field> verifyFields = Fields.getFind(value => value.IsVerify); if (verifyFields.Length != 0) { columnNames = new AutoCSer.Threading.LockDictionary <HashString, string[]>(); int index = 0; Verifyer.verifyFields = verifyFields.ToArray(); #if NOJIT fields = new sqlColumn.verifyDynamicMethod.field[verifyFields.length]; foreach (AutoCSer.code.cSharp.sqlModel.fieldInfo member in verify.verifyFields) { fields[index++].Set(member); } #else ColumnGroup.Verifyer dynamicMethod = new ColumnGroup.Verifyer(typeof(valueType), attribute); foreach (Field member in Verifyer.verifyFields) { dynamicMethod.Push(member, index++); } verifyer = (Func <valueType, Table, string[], bool>)dynamicMethod.Create <Func <valueType, Table, string[], bool> >(); #endif AutoCSer.Memory.Common.AddClearCache(columnNames.Clear, typeof(Verifyer), 60 * 60); } } }
static Column() { Type type = typeof(valueType); if (type.IsEnum || !type.IsValueType) { AutoCSer.LogHelper.Error(type.fullName() + " 非值类型,不能用作数据列", LogLevel.Error | LogLevel.AutoCSer); return; } attribute = TypeAttribute.GetAttribute <ColumnAttribute>(type, true) ?? ColumnAttribute.Default; foreach (MethodInfo method in type.GetMethods(System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic)) { #if NOJIT if (typeof(ICustom).IsAssignableFrom(method.ReturnType) #else if (typeof(ICustom <valueType>).IsAssignableFrom(method.ReturnType) #endif && method.GetParameters().Length == 0 && method.IsDefined(typeof(ColumnAttribute), false)) { object customValue = method.Invoke(null, null); if (customValue != null) { #if NOJIT custom = (ICustom)customValue; #else custom = (ICustom <valueType>)customValue; #endif return; } } } Fields = Field.Get(MemberIndexGroup <valueType> .GetFields(attribute.MemberFilters), true).ToArray(); dataColumns = new AutoCSer.Threading.LockDictionary <HashString, KeyValue <string, Type>[]>(); AutoCSer.Memory.Common.AddClearCache(dataColumns.Clear, typeof(Column <valueType>), 60 * 60); }
static Inserter() { if (attribute != null && custom == null && Fields != null) { columnNames = new AutoCSer.Threading.LockDictionary <HashString, string>(); #if NOJIT fields = new sqlModel.insertField[Fields.Length]; int index = 0; foreach (AutoCSer.code.cSharp.sqlModel.fieldInfo member in Fields) { fields[index++].Set(member); } #else ColumnGroup.Inserter dynamicMethod = new ColumnGroup.Inserter(typeof(valueType), attribute); foreach (Field member in Fields) { dynamicMethod.Push(member); } inserter = (Action <CharStream, valueType, ConstantConverter>)dynamicMethod.Create <Action <CharStream, valueType, ConstantConverter> >(); #endif AutoCSer.Memory.Common.AddClearCache(columnNames.Clear, typeof(Inserter), 60 * 60); } }