コード例 #1
0
        public MethodTemplate(MethodInfo method)
        {
            Method     = method;
            Name       = method.Name;
            IsAsync    = method.ReturnType.FullName.StartsWith(typeof(Task).FullName);
            ReturnType = new TypeTemplate(method.ReturnType);
            foreach (var attr in CustomAttributeData.GetCustomAttributes(method))
            {
                AttributeList.Add(new CustomAttributeTemplate(attr).ToString());
            }
            //方法参数
            foreach (var parameter in method.GetParameters())
            {
                Parameters.Add(new ParameterTemplate(parameter));
            }

            if (method.IsGenericMethod)
            {
                foreach (var argumentType in method.GetGenericArguments())
                {
                    var argument = new GenericArgumentTemplate()
                    {
                        Name = argumentType.Name
                    };
                    GenericArguments.Add(argument);

                    if (argumentType.GenericParameterAttributes == GenericParameterAttributes.None &&
                        argumentType.GetGenericParameterConstraints().Length == 0)
                    {
                        continue;
                    }

                    //class约束
                    if (argumentType.GenericParameterAttributes.HasFlag(GenericParameterAttributes.ReferenceTypeConstraint))
                    {
                        argument.Constraints.Add("class");
                    }
                    //值类型约束
                    if (argumentType.GenericParameterAttributes.HasFlag(GenericParameterAttributes.NotNullableValueTypeConstraint))
                    {
                        argument.Constraints.Add("struct");
                    }

                    foreach (var type in argumentType.GetGenericParameterConstraints())
                    {
                        argument.Constraints.Add(new TypeTemplate(type).ToString());
                    }

                    //无参构造函数
                    if (argumentType.GenericParameterAttributes.HasFlag(GenericParameterAttributes.DefaultConstructorConstraint))
                    {
                        argument.Constraints.Add("new()");
                    }
                }
            }
        }
コード例 #2
0
        /// <summary>
        /// Initializes this class.
        /// </summary>
        /// <param name="memberInfo">Represented <see cref="MemberInfo"/></param>
        /// <seealso cref="InterLinqMemberInfo.Initialize"/>
        public override void Initialize(MemberInfo memberInfo)
        {
            base.Initialize(memberInfo);
            MethodInfo methodInfo = memberInfo as MethodInfo;

            ReturnType = InterLinqTypeSystem.Instance.GetInterLinqVersionOf <InterLinqType>(methodInfo.ReturnType);
            IsStatic   = methodInfo.IsStatic;
            if (methodInfo.IsGenericMethod)
            {
                foreach (Type genericArgument in methodInfo.GetGenericArguments())
                {
                    GenericArguments.Add(InterLinqTypeSystem.Instance.GetInterLinqVersionOf <InterLinqType>(genericArgument));
                }
            }
        }
コード例 #3
0
        public static GenericArguments ParseGenericArguments(string type, string path, int absoluteCharOffset)
        {
            GenericArguments generics = new GenericArguments();

            var p = type.IndexOf('<');
            System.Text.StringBuilder s = new System.Text.StringBuilder();
            if (p > -1)
            {
                for (int i = p + 1; i < type.Length; i++)
                {

                    var c = type[i];

                    switch (c)
                    {

                        case '>':
                        case ',':
                            generics.Add(s.ToString().Trim());
                            s.Clear();
                            break;

                        default:
                            s.Append(c);
                            break;
                    }

                }
            }

            string txt = LoadText(path, absoluteCharOffset);
            System.Text.RegularExpressions.MatchCollection matchs = r.Matches(txt);

            foreach (System.Text.RegularExpressions.Match item in matchs)
            {
                string t = item.Value.Substring("where".Length).Trim();
                GenericArgument gen = generics.Resolve(t);
                if (gen != null)
                {
                    t = txt.Substring(item.Index + item.Length + 1).Trim();
                    var m2 = r.Match(t);
                    if (m2.Success)
                        t = t.Substring(0, m2.Index);
                    var constraints = t.Split(',');
                    foreach (string constraint in constraints)
                        gen.AddConstraint(constraint.Trim());
                }
            }

            return generics;
        }