public FactUniverse() { _knownTypes = new ObservableCache <Type, TypeFacts>( ReflectionHelper.TypeEqualityComparer, CreateTypeFacts); _knownMethods = new ObservableCache <MethodBase, MethodFacts>( ReflectionHelper.MethodEqualityComparer, CreateMethodFacts); _knownFields = new ObservableCache <FieldInfo, FieldFacts>( ReflectionHelper.FieldEqualityComparer, CreateFieldFacts); KnownTypes = _knownTypes; KnownMethodBases = _knownMethods; _knownTypes.AutoDo(OnNewType); KnownInterfaces = KnownTypes .Where(type => type.TheType.IsInterface); KnownAbstractClasses = KnownTypes .Where(type => type.TheType.IsAbstract); KnownValueTypes = KnownTypes .Where(type => type.TheType.IsValueType); KnownInstantiables = KnownTypes .Where(type => !type.TheType.IsInterface && !type.TheType.IsAbstract && !type.TheType.IsGenericParameter); KnownMethods = KnownMethodBases .Where(method => method.Method is MethodInfo); KnownConstructors = KnownMethodBases .Where(method => method.Method is ConstructorInfo); KnownMethodBases.ObserveOn(Scheduler.CurrentThread).AutoDo(OnNewMethod); KnownAllocationSites = _allocSites.AsObservable(); }