internal ProjectionCollectionType(TypeKind kind, Type type, ProjectionFactory factory) : base(type, kind, factory) { // Must register before getting key/item types, due to possible cycles // Example: A -> IList<B> -> B -> IList<B> factory.RegisterProjectionType(this); Type keyType, itemType; GetSubtypes(out keyType, out itemType); this.keyType = factory.GetProjectionTypeUnsafe(keyType ); this.itemType = factory.GetProjectionTypeUnsafe(itemType); }
internal ProjectionProperty(PropertyInfo property, ProjectionStructureType declaringType, ProjectionPropertyCollection properties, ProjectionFactory factory, ITraitResolution resolution) { this.name = property.Name; this.declaringType = declaringType; this.propertyType = factory.GetProjectionTypeUnsafe(property.PropertyType); this.accessors = new IPropertyAccessor[4]; // factory.Providers.Count var getter = property.GetGetMethod(); var setter = property.GetSetMethod(); if (getter != null) { getterHandle = getter.MethodHandle; flags |= Flags.CanRead; } if (setter != null) { setterHandle = setter.MethodHandle; flags |= Flags.CanWrite; } var aggregator = new ProjectionPropertyTraitAggregator(this, properties); resolution.ProvidePropertyTraits(this, property, aggregator); this.aggregator = aggregator; this.overrides = aggregator.Overrides; }
private static ProjectionType[] GetProjectionTypes(Type[] interfaces, ProjectionFactory factory) { var baseTypes = new ProjectionType[interfaces.Length]; for (var i = 0; i < interfaces.Length; i++) { var baseType = baseTypes[i] = factory.GetProjectionTypeUnsafe(interfaces[i]) as ProjectionStructureType; if (baseType == null) throw Error.InvalidProjectionType(interfaces[i]); } return baseTypes; }