コード例 #1
0
ファイル: TypeLoader.cs プロジェクト: gamlerhart/db4opad
 private Maybe<Type> FindInCurrentAppDomain(TypeName toFind)
 {
     var assembly = from a in AppDomain.CurrentDomain.GetAssemblies()
                    where a.GetName().Name == toFind.AssemblyName
                    select a;
     return assembly.FirstMaybe()
         .Combine(a => LoadTypeFromAssembly(a,toFind));
 }
コード例 #2
0
ファイル: KnownType.cs プロジェクト: gamlerhart/db4opad
 protected KnownType(Type typeInfo, TypeName theName,
     Func<ITypeDescription,IEnumerable<SimpleFieldDescription>> fieldsInitializer)
 {
     new { typeInfo }.CheckNotNull();
     this.Name = theName.NameWithGenerics.Split('.').Last();
     this.typeInfo = typeInfo;
     this.TypeName = theName;
     this.Fields = fieldsInitializer(this).ToList();
 }
コード例 #3
0
ファイル: MetaDataReader.cs プロジェクト: gamlerhart/db4opad
 private ITypeDescription CreateArrayType(TypeName fullName,
     IReflectClass classInfo, Func<TypeName, Maybe<IReflectClass>> classLookup,
     IDictionary<string, ITypeDescription> knownTypes)
 {
     var innerType = GetOrCreateType(classInfo.GetComponentType(), classLookup, knownTypes);
     var type = ArrayDescription.Create(innerType, fullName.OrderOfArray);
     knownTypes[fullName.FullName] = type;
     return type;
 }
コード例 #4
0
 public static SimpleClassDescription Create(TypeName fullName, Maybe<ITypeDescription> baseClass,
     Func<ITypeDescription, IEnumerable<SimpleFieldDescription>> fieldGenerator)
 {
     if (fullName.OrderOfArray != 0)
     {
         throw new ArgumentException("Cannot be an array-type " + fullName.FullName);
     }
     var toConstruct = new SimpleClassDescription(fullName, baseClass);
     toConstruct.fields = fieldGenerator(toConstruct).ToArray();
     return toConstruct;
 }
コード例 #5
0
ファイル: TypeNameParser.cs プロジェクト: gamlerhart/db4opad
 private static TypeName CreateType(string typeName, string assemblyName, int array,
     IEnumerable<TypeName> genericArgs = null)
 {
     if (null == genericArgs)
     {
         genericArgs = new TypeName[0];
     }
     return TypeName.Create(typeName, assemblyName, genericArgs,array);
 }
コード例 #6
0
ファイル: TypeNameParser.cs プロジェクト: gamlerhart/db4opad
 private static IEnumerable<TypeName> CheckAndCreateGenericList(IEnumerable<TypeName> argList, TypeName lastArg,
     int expectedLength)
 {
     var result = argList.Concat(new[] {lastArg}).ToArray();
     if (expectedLength != result.Length)
     {
         throw new ArgumentException(
             string.Format("argument-count hasn't the expected count. List-count {0}, expected {1}",
                           result.Length, expectedLength));
     }
     return result;
 }
コード例 #7
0
ファイル: MetaDataReader.cs プロジェクト: gamlerhart/db4opad
 private ITypeDescription GetOrCreateTypeByName(TypeName name,
     Func<TypeName, Maybe<IReflectClass>> classLookup,
     IDictionary<string, ITypeDescription> knownTypes)
 {
     var type = knownTypes.TryGet(name.FullName);
     if(type.HasValue)
     {
         return type.Value;
     }
     var systemType = typeResolver(name);
     return systemType.Convert(KnownType.Create)
         .GetValue(()=>classLookup(name)
             .Convert(n=>CreateType(name, n, classLookup, knownTypes))
             .GetValue(()=>MockTypeFor(name,knownTypes)));
 }
コード例 #8
0
ファイル: TypeLoader.cs プロジェクト: gamlerhart/db4opad
 private static bool IsGeneric(TypeName toFind)
 {
     return toFind.GenericArguments.Any();
 }
コード例 #9
0
ファイル: TypeLoader.cs プロジェクト: gamlerhart/db4opad
 private Maybe<Type> TryCreateGenericInstance(TypeName toFind, Type type)
 {
     if(toFind.GenericArguments.Any(t=>!t.HasValue))
     {
         return type;
     }
     var types = toFind.GenericArguments.Select(t=>Resolve(t.Value));
     if(types.All(t=>t.HasValue))
     {
         return type.MakeGenericType(types.Select(t=>t.Value).ToArray());
     }
     return Maybe<Type>.Empty;
 }
コード例 #10
0
ファイル: TypeLoader.cs プロジェクト: gamlerhart/db4opad
 private Maybe<Type> LoadTypeFromAssembly(Assembly assembly, TypeName toFind)
 {
     var name = Generify(toFind);
     return assembly.GetType(name).AsMaybe().Combine(t=>InstantiateGeneric(t,toFind));
 }
コード例 #11
0
ファイル: TypeName.cs プロジェクト: gamlerhart/db4opad
 private bool Equals(TypeName other)
 {
     if (ReferenceEquals(null, other)) return false;
     if (ReferenceEquals(this, other)) return true;
     return Equals(other.NameAndNamespace, NameAndNamespace)
         && Equals(other.AssemblyName, AssemblyName)
         && Equals(other.OrderOfArray, OrderOfArray)
         && other.GenericArguments.SequenceEqual(GenericArguments);
 }
コード例 #12
0
ファイル: TypeName.cs プロジェクト: gamlerhart/db4opad
 private static void BuildGenericArguments(StringBuilder toBuild, TypeName typeName,
     Action<StringBuilder, Maybe<TypeName>> typeNameBuilder)
 {
     var arguments = typeName.GenericArguments.ToArray();
     if (arguments.Any())
     {
         toBuild.Append('[');
         for (var i = 0; i < arguments.Length; i++)
         {
             AddArg(toBuild, arguments[i], typeNameBuilder);
             if (IsNotLastArgument(i, arguments))
             {
                 toBuild.Append(", ");
             }
         }
         toBuild.Append(']');
     }
 }
コード例 #13
0
ファイル: TypeName.cs プロジェクト: gamlerhart/db4opad
 public static TypeName CreateArrayOf(TypeName type, int array)
 {
     return new TypeName(type.rawName, type.AssemblyName, array, type.GenericArguments);
 }
コード例 #14
0
ファイル: MetaDataReader.cs プロジェクト: gamlerhart/db4opad
 private SimpleFieldDescription CreateField(TypeName declaredOn, IReflectField field,
     Func<IReflectClass, ITypeDescription> typeLookUp)
 {
     var fieldType = typeLookUp(field.GetFieldType());
     return SimpleFieldDescription.Create(field.GetName(),
                                          fieldType, IndexLookUp(declaredOn, field.GetName(), fieldType.TypeName));
 }
コード例 #15
0
ファイル: MetaDataReader.cs プロジェクト: gamlerhart/db4opad
 /// <summary>
 /// For some types there is no type info available from db4o. Therefore we just create an empty class.
 /// </summary>
 private ITypeDescription MockTypeFor(TypeName typeName,
     IDictionary<string, ITypeDescription> knownTypes)
 {
     var type= SimpleClassDescription.Create(typeName, t => Enumerable.Empty<SimpleFieldDescription>());
     knownTypes[typeName.FullName] = type;
     return type;
 }
コード例 #16
0
ファイル: MetaDataReader.cs プロジェクト: gamlerhart/db4opad
 private IndexingState IndexLookUp(TypeName declaringtype, string fieldName, TypeName fieldtype)
 {
     var storedInfo = cachedStoredClasses.TryGet(declaringtype.FullName);
     return storedInfo.Combine(sc =>
                               (from f in sc.Fields
                                where f.FieldName == fieldName &&
                                      f.TypeName == fieldtype.FullName
                                select f).FirstMaybe())
         .Convert(f => f.IndexState)
         .GetValue(IndexingState.Unknown);
 }
コード例 #17
0
 private SimpleClassDescription(TypeName fullName, Maybe<ITypeDescription> baseClass)
     : base(fullName,baseClass)
 {
 }
コード例 #18
0
ファイル: CodeGenerator.cs プロジェクト: gamlerhart/db4opad
 private static TypeBuilder CreateType(ModuleBuilder modBuilder,
     TypeName className, Maybe<Type> baseType)
 {
     return modBuilder.DefineType(BuildName(className),
                                  TypeAttributes.Class | TypeAttributes.Public, baseType.GetValue(typeof(object)));
 }
コード例 #19
0
 public static SimpleClassDescription Create(TypeName fullName,
     Func<ITypeDescription, IEnumerable<SimpleFieldDescription>> fieldGenerator)
 {
     return Create(fullName,Maybe<ITypeDescription>.Empty,fieldGenerator);
 }
コード例 #20
0
ファイル: CodeGenerator.cs プロジェクト: gamlerhart/db4opad
 private static string BuildName(TypeName className)
 {
     return NameSpace + "." + CodeGenerationUtils.ClassName(className);
 }
コード例 #21
0
ファイル: TypeLoader.cs プロジェクト: gamlerhart/db4opad
 private Maybe<Type> InstantiateGeneric(Type type, TypeName toFind)
 {
     return IsGeneric(toFind) ? TryCreateGenericInstance(toFind, type) : type;
 }
コード例 #22
0
 internal static string ClassName(TypeName className)
 {
     return className.NameWithGenerics + "_"
            + NormalizedAssemblyName(className);
 }
コード例 #23
0
ファイル: TypeLoader.cs プロジェクト: gamlerhart/db4opad
 private Maybe<Type> Resolve(TypeName toFind)
 {
     return FindInCurrentAppDomain(toFind)
         .Otherwise(()=>FindInGivenAssemblyPaths(toFind));
 }
コード例 #24
0
ファイル: TypeLoader.cs プロジェクト: gamlerhart/db4opad
 private Maybe<Type> FindInGivenAssemblyPaths(TypeName toFind)
 {
     foreach (var assemblyPath in filePaths)
     {
         var type = TryLoad(assemblyPath).Combine(a => LoadTypeFromAssembly(a,toFind));
         if (type.HasValue)
         {
             return type;
         }
     }
     return Maybe<Type>.Empty;
 }
コード例 #25
0
ファイル: TypeLoader.cs プロジェクト: gamlerhart/db4opad
 private static string Generify(TypeName toFind)
 {
     return toFind.NameAndNamespace;
 }
コード例 #26
0
ファイル: MetaDataReader.cs プロジェクト: gamlerhart/db4opad
 private IEnumerable<SimpleFieldDescription> ExtractFields(TypeName declaringTypeName, IReflectClass classInfo,
     Func<IReflectClass, ITypeDescription> typeLookUp)
 {
     return classInfo.GetDeclaredFields()
         .Where(f=>!(f is GenericVirtualField))
         .Select(f => CreateField(declaringTypeName, f, typeLookUp));
 }
コード例 #27
0
 internal static string NormalizedAssemblyName(TypeName className)
 {
     return className.AssemblyName.Replace('.', '_').Replace('-', '_');
 }
コード例 #28
0
ファイル: MetaDataReader.cs プロジェクト: gamlerhart/db4opad
 private Maybe<IReflectClass> FindReflectClass(TypeName typeName,
     IReflectClass[] allKnownClasses)
 {
     return (from c in allKnownClasses
             where c.GetName() == typeName.FullName
             select c).FirstMaybe();
 }
コード例 #29
0
 protected TypeDescriptionBase(TypeName typeName, Maybe<ITypeDescription> baseClass)
 {
     Name = typeName.NameWithGenerics.Split('.').Last();
     TypeName = typeName;
     BaseClass = baseClass;
 }
コード例 #30
0
 private ArrayDescription(TypeName typeName, ITypeDescription innerType)
     : base(typeName, Maybe.From(KnownType.Array))
 {
     this.innerType = innerType;
 }