internal TypeCrawler() { _type = typeof(T); _constructors = new Lazy <IConstructor[]>( () => _type.GetConstructors( BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance) .Where(c => c.GetParameters().All(p => !p.ParameterType.IsPointer)) .Select(Constructor.Get) .ToArray()); _fields = new Lazy <IField[]>( () => _type.GetFields( BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static) .Where(f => !f.FieldType.IsPointer) .Select(Field.Get) .ToArray()); _properties = new Lazy <IProperty[]>( () => _type.GetProperties( BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static) .Where(p => !p.PropertyType.IsPointer) .Select(Property.Get) .ToArray()); _methods = new Lazy <IMethod[]>( () => _type.GetMethods( BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static) .Where(p => !p.ReturnType.IsPointer && p.GetParameters().All(param => !param.ParameterType.IsPointer)) .Select(Method.Get) .ToArray()); _members = new Lazy <IMember[]>( () => Constructors.Cast <IMember>() .Concat(Fields) .Concat(Properties) .Concat(Methods) .ToArray()); _fieldMap = new Lazy <IDictionary <string, IField> >(() => Fields.ToDictionary(f => f.Name)); _propertyMap = new Lazy <IDictionary <string, IProperty> >(() => Properties.ToDictionary(p => p.Name)); }