コード例 #1
0
        //
        // This is similar to CreateDispenser() except it doesn't constrain the key to be a reference type.
        // As a result, some algorithms will not be available for use.
        //
        public static Dispenser <K, V> CreateDispenserV <K, V>(DispenserScenario scenario, Func <K, V> factory)
            where K : IEquatable <K>
            where V : class
        {
            DispenserAlgorithm algorithm = _dispenserPolicy.GetAlgorithm(scenario);

            Debug.Assert(algorithm != DispenserAlgorithm.ReuseAsLongAsKeyIsAlive,
                         "Use CreateDispenser() if you want to use this algorithm. The key must not be a valuetype.");

            if (algorithm == DispenserAlgorithm.CreateAlways)
            {
                return(new DispenserThatAlwaysCreates <K, V>(factory));
            }
            else if (algorithm == DispenserAlgorithm.ReuseAlways)
            {
                return(new DispenserThatAlwaysReuses <K, V>(factory));
            }
            else if (algorithm == DispenserAlgorithm.ReuseAsLongAsValueIsAlive)
            {
                return(new DispenserThatReusesAsLongAsValueIsAlive <K, V>(factory));
            }
            else if (algorithm == DispenserAlgorithm.LatchesTypeInfoInsideType)
            {
                return((Dispenser <K, V>)(Object)(new DispenserThatLatchesTypeInfosInsideTypes((Func <RuntimeType, RuntimeTypeInfo>)(Object) factory)));
            }

            throw new Exception();
        }
コード例 #2
0
ファイル: DispenserFactory.cs プロジェクト: z77ma/runtime
        //
        // Note: If your K is a valuetype, use CreateDispenserV() instead. Some algorithms will not be available for use.
        //
        public static Dispenser <K, V> CreateDispenser <K, V>(DispenserScenario scenario, Func <K, V> factory)
            where K : class, IEquatable <K>
            where V : class
        {
            DispenserAlgorithm algorithm = s_dispenserPolicy.GetAlgorithm(scenario);

            if (algorithm == DispenserAlgorithm.ReuseAsLongAsKeyIsAlive)
            {
                return(new DispenserThatReusesAsLongAsKeyIsAlive <K, V>(factory));
            }
            else
            {
                return(CreateDispenserV <K, V>(scenario, factory));
            }

            throw new Exception();
        }
コード例 #3
0
        //
        // Note: If your K is a valuetype, use CreateDispenserV() instead. Some algorithms will not be available for use.
        //
        public static Dispenser <K, V> CreateDispenser <K, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)] V>(DispenserScenario scenario, Func <K, V> factory)
            where K : class, IEquatable <K>
            where V : class
        {
            DispenserAlgorithm algorithm = s_dispenserPolicy.GetAlgorithm(scenario);

            if (algorithm == DispenserAlgorithm.ReuseAsLongAsKeyIsAlive)
            {
                return(new DispenserThatReusesAsLongAsKeyIsAlive <K, V>(factory));
            }
            else
            {
                return(CreateDispenserV <K, V>(scenario, factory));
            }

            throw new Exception();
        }