Esempio n. 1
0
        /// <summary>
        /// Creates a sample instance of the described type.
        /// </summary>
        /// <param name="options">creation options</param>
        public object GetSampleInstance(ETypeCreationOptions options = ETypeCreationOptions.AnyObject)
        {
            Contract.Requires(
                !(options.HasFlag(ETypeCreationOptions.AdditiveNeutral) && options.HasFlag(ETypeCreationOptions.MultiplicativeNeutral)) &&
                !(options.HasFlag(ETypeCreationOptions.AdditiveNeutral) && options.HasFlag(ETypeCreationOptions.NonZero)) &&
                !(options.HasFlag(ETypeCreationOptions.MultiplicativeNeutral) && options.HasFlag(ETypeCreationOptions.NonZero)));

            if (IsArtificial)
            {
                throw new InvalidOperationException("Cannot construct a sample instance from an artificial type");
            }

            if (options.HasFlag(ETypeCreationOptions.AdditiveNeutral) ||
                options.HasFlag(ETypeCreationOptions.MultiplicativeNeutral) ||
                options.HasFlag(ETypeCreationOptions.NonZero))
            {
                var atf = CILType.GetCustomOrInjectedAttribute <IAlgebraicTypeFactory>();
                return(atf.CreateInstance(options, _sample));
            }

            if (_sample != null)
            {
                return(_sample);
            }

            if (options.HasFlag(ETypeCreationOptions.ReturnNullIfUnavailable))
            {
                return(null);
            }

            if (!options.HasFlag(ETypeCreationOptions.ForceCreation) && (IsConstrained || !IsStatic))
            {
                throw new InvalidOperationException("Cannot construct sample instance from constrained incomplete or non-static type");
            }

            object inst = Activator.CreateInstance(CILType);

            return(inst);
        }
Esempio n. 2
0
        private void InitTypeParams()
        {
            var mtit = CILType.GetCustomOrInjectedAttribute <MapToIntrinsicType>();

            if (mtit != null)
            {
                HasIntrinsicTypeOverride = true;
                IntrinsicTypeOverride    = mtit.IntrinsicType;
            }
            else if (CILType.GetCustomOrInjectedAttribute <CompilerGeneratedAttribute>() != null)
            {
                HasIntrinsicTypeOverride = true;
                IntrinsicTypeOverride    = EIntrinsicTypes.IllegalRuntimeType;
            }
            else
            {
                HasIntrinsicTypeOverride = false;
            }

            if (CILType.IsArray)
            {
                int rank = CILType.GetArrayRank();
                TypeParams = new object[rank];
                if (_sample != null)
                {
                    Array array = (Array)_sample;
                    for (int i = 0; i < rank; i++)
                    {
                        TypeParams[i] = array.GetLength(i);
                    }
                }
            }
            else
            {
                List <object> typeParams = new List <object>();
                foreach (PropertyInfo pi in CILType.GetProperties(
                             BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic))
                {
                    object[] tparams = pi.GetCustomAndInjectedAttributes(typeof(TypeParameter));
                    if (tparams.Length > 0)
                    {
                        object arg = _sample == null ? null : pi.GetGetMethod().Invoke(_sample, new object[0]);
                        typeParams.Add(arg);
                    }
                }
                TypeParams = typeParams.ToArray();
            }

            if (IsComplete)
            {
                if (CILType.IsArray)
                {
                    Range[] result = new Range[Rank];
                    for (int i = 0; i < result.Length; i++)
                    {
                        result[i] = new Range(0, (int)TypeParams[i] - 1, EDimDirection.To);
                    }
                    Constraints = result;
                }
                else
                {
                    List <Range> result = new List <Range>();
                    foreach (PropertyInfo pi in CILType.GetProperties(
                                 BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic))
                    {
                        object[] tparams = pi.GetCustomAndInjectedAttributes(typeof(TypeParameter));
                        if (tparams.Length > 0)
                        {
                            TypeParameter tparam = (TypeParameter)tparams[0];
                            MethodInfo    miconv = tparam.RangeConverter.GetMethod("ConvertToRange",
                                                                                   BindingFlags.Static | BindingFlags.Public);
                            object arg  = pi.GetGetMethod().Invoke(_sample, new object[0]);
                            Range  carg = (Range)miconv.Invoke(null, new object[] { arg });
                            result.Add(carg);
                        }
                    }
                    Constraints = result.ToArray();
                }
            }

            Element0Type = GetElement0Type();
        }