// // 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(); }
public override sealed DispenserAlgorithm GetAlgorithm(DispenserScenario scenario) { #if TEST_CODEGEN_OPTIMIZATION return DispenserAlgorithm.CreateAlways; #else switch (scenario) { // Assembly + NamespaceTypeName to Type case DispenserScenario.AssemblyAndNamespaceTypeName_Type: return DispenserAlgorithm.ReuseAsLongAsValueIsAlive; // Assembly refName to Assembly case DispenserScenario.AssemblyRefName_Assembly: return DispenserAlgorithm.ReuseAsLongAsValueIsAlive; // RuntimeAssembly to CaseInsensitiveTypeDictionary case DispenserScenario.RuntimeAssembly_CaseInsensitiveTypeDictionary: return DispenserAlgorithm.ReuseAlways; // Scope definition handle to RuntimeAssembly case DispenserScenario.Scope_Assembly: return DispenserAlgorithm.ReuseAsLongAsValueIsAlive; default: return DispenserAlgorithm.CreateAlways; } #endif //!TEST_CODEGEN_OPTIMIZATION }
public sealed override DispenserAlgorithm GetAlgorithm(DispenserScenario scenario) { #if TEST_CODEGEN_OPTIMIZATION return(DispenserAlgorithm.CreateAlways); #else switch (scenario) { // Assembly + NamespaceTypeName to Type case DispenserScenario.AssemblyAndNamespaceTypeName_Type: return(DispenserAlgorithm.ReuseAsLongAsValueIsAlive); // Assembly refName to Assembly case DispenserScenario.AssemblyRefName_Assembly: return(DispenserAlgorithm.ReuseAsLongAsValueIsAlive); // RuntimeAssembly to CaseInsensitiveTypeDictionary case DispenserScenario.RuntimeAssembly_CaseInsensitiveTypeDictionary: return(DispenserAlgorithm.ReuseAlways); // Scope definition handle to RuntimeAssembly case DispenserScenario.Scope_Assembly: return(DispenserAlgorithm.ReuseAsLongAsValueIsAlive); default: return(DispenserAlgorithm.CreateAlways); } #endif //!TEST_CODEGEN_OPTIMIZATION }
public sealed override DispenserAlgorithm GetAlgorithm(DispenserScenario scenario) { #if TEST_CODEGEN_OPTIMIZATION return DispenserAlgorithm.CreateAlways; #else switch (scenario) { // Type.GetTypeInfo() for Runtime types. case DispenserScenario.Type_TypeInfo: return DispenserAlgorithm.LatchesTypeInfoInsideType; // Metadata typedef handle to RuntimeTypeInfo case DispenserScenario.TypeDef_TypeInfo: return DispenserAlgorithm.ReuseAsLongAsValueIsAlive; // TypeInfo + Name to EventInfo case DispenserScenario.TypeInfoAndName_EventInfo: return DispenserAlgorithm.ReuseAsLongAsValueIsAlive; // TypeInfo + Name to FieldInfo case DispenserScenario.TypeInfoAndName_FieldInfo: return DispenserAlgorithm.ReuseAsLongAsValueIsAlive; // TypeInfo + Name to MethodInfo case DispenserScenario.TypeInfoAndName_MethodInfo: return DispenserAlgorithm.ReuseAsLongAsValueIsAlive; // TypeInfo + Name to PropertyInfo case DispenserScenario.TypeInfoAndName_PropertyInfo: return DispenserAlgorithm.ReuseAsLongAsValueIsAlive; // Assembly + NamespaceTypeName to Type case DispenserScenario.AssemblyAndNamespaceTypeName_Type: return DispenserAlgorithm.ReuseAsLongAsValueIsAlive; // Assembly refName to Assembly case DispenserScenario.AssemblyRefName_Assembly: return DispenserAlgorithm.ReuseAsLongAsValueIsAlive; // RuntimeAssembly to CaseInsensitiveTypeDictionary case DispenserScenario.RuntimeAssembly_CaseInsensitiveTypeDictionary: return DispenserAlgorithm.ReuseAlways; // Scope definition handle to RuntimeAssembly case DispenserScenario.Scope_Assembly: return DispenserAlgorithm.ReuseAsLongAsValueIsAlive; default: return DispenserAlgorithm.CreateAlways; } #endif //!TEST_CODEGEN_OPTIMIZATION }
public sealed override DispenserAlgorithm GetAlgorithm(DispenserScenario scenario) { #if TEST_CODEGEN_OPTIMIZATION return(DispenserAlgorithm.CreateAlways); #else switch (scenario) { // Type.GetTypeInfo() for Runtime types. case DispenserScenario.Type_TypeInfo: return(DispenserAlgorithm.LatchesTypeInfoInsideType); // Metadata typedef handle to RuntimeTypeInfo case DispenserScenario.TypeDef_TypeInfo: return(DispenserAlgorithm.ReuseAsLongAsValueIsAlive); // TypeInfo + Name to EventInfo case DispenserScenario.TypeInfoAndName_EventInfo: return(DispenserAlgorithm.ReuseAsLongAsValueIsAlive); // TypeInfo + Name to FieldInfo case DispenserScenario.TypeInfoAndName_FieldInfo: return(DispenserAlgorithm.ReuseAsLongAsValueIsAlive); // TypeInfo + Name to MethodInfo case DispenserScenario.TypeInfoAndName_MethodInfo: return(DispenserAlgorithm.ReuseAsLongAsValueIsAlive); // TypeInfo + Name to PropertyInfo case DispenserScenario.TypeInfoAndName_PropertyInfo: return(DispenserAlgorithm.ReuseAsLongAsValueIsAlive); // Assembly + NamespaceTypeName to Type case DispenserScenario.AssemblyAndNamespaceTypeName_Type: return(DispenserAlgorithm.ReuseAsLongAsValueIsAlive); // Assembly refName to Assembly case DispenserScenario.AssemblyRefName_Assembly: return(DispenserAlgorithm.ReuseAsLongAsValueIsAlive); // RuntimeAssembly to CaseInsensitiveTypeDictionary case DispenserScenario.RuntimeAssembly_CaseInsensitiveTypeDictionary: return(DispenserAlgorithm.ReuseAlways); // Scope definition handle to RuntimeAssembly case DispenserScenario.Scope_Assembly: return(DispenserAlgorithm.ReuseAsLongAsValueIsAlive); default: return(DispenserAlgorithm.CreateAlways); } #endif //!TEST_CODEGEN_OPTIMIZATION }
// // 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(); }
public sealed override DispenserAlgorithm GetAlgorithm(DispenserScenario scenario) { switch (scenario) { // Assembly + NamespaceTypeName to Type case DispenserScenario.AssemblyAndNamespaceTypeName_Type: return DispenserAlgorithm.ReuseAsLongAsValueIsAlive; // Assembly refName to Assembly case DispenserScenario.AssemblyRefName_Assembly: return DispenserAlgorithm.ReuseAsLongAsValueIsAlive; // RuntimeAssembly to CaseInsensitiveTypeDictionary case DispenserScenario.RuntimeAssembly_CaseInsensitiveTypeDictionary: return DispenserAlgorithm.ReuseAlways; // Scope definition handle to RuntimeAssembly case DispenserScenario.Scope_Assembly: return DispenserAlgorithm.ReuseAsLongAsValueIsAlive; default: return DispenserAlgorithm.CreateAlways; } }
public sealed override DispenserAlgorithm GetAlgorithm(DispenserScenario scenario) { switch (scenario) { // Assembly + NamespaceTypeName to Type case DispenserScenario.AssemblyAndNamespaceTypeName_Type: return(DispenserAlgorithm.ReuseAsLongAsValueIsAlive); // Assembly refName to Assembly case DispenserScenario.AssemblyRefName_Assembly: return(DispenserAlgorithm.ReuseAsLongAsValueIsAlive); // RuntimeAssembly to CaseInsensitiveTypeDictionary case DispenserScenario.RuntimeAssembly_CaseInsensitiveTypeDictionary: return(DispenserAlgorithm.ReuseAlways); // Scope definition handle to RuntimeAssembly case DispenserScenario.Scope_Assembly: return(DispenserAlgorithm.ReuseAlways); // Match policy used for runtime Assembly instances in other runtime flavors. default: return(DispenserAlgorithm.CreateAlways); } }
public abstract DispenserAlgorithm GetAlgorithm(DispenserScenario scenario);
// // 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(); }