コード例 #1
0
        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);
        }
コード例 #2
0
ファイル: TypeUtils.cs プロジェクト: lostmsu/orleans
        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;
        }
コード例 #3
0
        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);
        }