public IDictionary <string, GrainTypeData> GetGrainClassTypes(bool strict) { var result = new Dictionary <string, GrainTypeData>(); IDictionary <string, Type> grainStateTypes = GetGrainStateTypes(strict); Type[] grainTypes = strict ? TypeUtils.GetTypes(TypeUtils.IsConcreteGrainClass).ToArray() : TypeUtils.GetTypes(discoveredAssemblyLocations, TypeUtils.IsConcreteGrainClass).ToArray(); foreach (var grainType in grainTypes) { var className = TypeUtils.GetFullName(grainType); if (result.ContainsKey(className)) { throw new InvalidOperationException( string.Format("Precondition violated: GetLoadedGrainTypes should not return a duplicate type ({0})", className)); } var parameterizedName = grainType.Namespace + "." + TypeUtils.GetParameterizedTemplateName(grainType); Type grainStateType; grainStateTypes.TryGetValue(parameterizedName, out grainStateType); GrainTypeData typeData = GetTypeData(grainType, grainStateType); result.Add(className, typeData); } LogGrainTypesFound(logger, result); return(result); }
public static CodeTypeParameterCollection GenericTypeParameters(Type t) { if (!t.IsGenericType) return null; var p = new CodeTypeParameterCollection(); foreach (var genericParameter in t.GetGenericTypeDefinition().GetGenericArguments()) { var param = new CodeTypeParameter(genericParameter.Name); if ((genericParameter.GenericParameterAttributes & GenericParameterAttributes.ReferenceTypeConstraint) != GenericParameterAttributes.None) { param.Constraints.Add(" class"); } if ((genericParameter.GenericParameterAttributes & GenericParameterAttributes.NotNullableValueTypeConstraint) != GenericParameterAttributes.None) { param.Constraints.Add(" struct"); } var constraints = genericParameter.GetGenericParameterConstraints(); foreach (var constraintType in constraints) { param.Constraints.Add( new CodeTypeReference(TypeUtils.GetParameterizedTemplateName(constraintType, false, x => true))); } if ((genericParameter.GenericParameterAttributes & GenericParameterAttributes.DefaultConstructorConstraint) != GenericParameterAttributes.None) { param.HasConstructorConstraint = true; } p.Add(param); } return p; }
public IDictionary <string, GrainTypeData> GetGrainClassTypes(bool strict) { var result = new Dictionary <string, GrainTypeData>(); IDictionary <string, Type> grainStateTypes = GetGrainStateTypes(strict); Type[] grainTypes = strict ? TypeUtils.GetTypes(TypeUtils.IsConcreteGrainClass).ToArray() : TypeUtils.GetTypes(discoveredAssemblyLocations, TypeUtils.IsConcreteGrainClass).ToArray(); foreach (var grainType in grainTypes) { var className = TypeUtils.GetFullName(grainType); if (result.ContainsKey(className)) { throw new InvalidOperationException( string.Format("Precondition violated: GetLoadedGrainTypes should not return a duplicate type ({0})", className)); } var parameterizedName = grainType.Namespace + "." + TypeUtils.GetParameterizedTemplateName(grainType); Type grainStateType; grainStateTypes.TryGetValue(parameterizedName, out grainStateType); if (grainStateType == null) // check if grainType derives from Grain<T> where T is a concrete class { var parentType = grainType.BaseType; while (parentType != typeof(Grain) && parentType != typeof(object)) { if (parentType.IsGenericType) { var definition = parentType.GetGenericTypeDefinition(); if (definition == typeof(Grain <>)) { var stateArg = parentType.GetGenericArguments()[0]; if (stateArg.IsClass) { grainStateType = stateArg; break; } } } parentType = parentType.BaseType; } } GrainTypeData typeData = GetTypeData(grainType, grainStateType); result.Add(className, typeData); } LogGrainTypesFound(logger, result); return(result); }