• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C# MethodDeclaration类代码示例

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

本文整理汇总了C#中MethodDeclaration的典型用法代码示例。如果您正苦于以下问题:C# MethodDeclaration类的具体用法?C# MethodDeclaration怎么用?C# MethodDeclaration使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。



MethodDeclaration类属于命名空间,在下文中一共展示了MethodDeclaration类的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C#代码示例。

示例1: ValidateMethod

        private void ValidateMethod(MethodDeclaration method, List<string> list, CompilationResult result)
        {
            var name = method.Name;

            if (String.IsNullOrWhiteSpace(name))
            {
                result.AddError(new CompilationMessage
                {
                    FilePath = method.OriginatingTree != null ? method.OriginatingTree.FilePath : null,
                    Location = DocumentLocation.FromTreeNode(method.OriginatingTree, method.OriginatingNode),
                    Message = "All generated method calls must have a valid name."
                });

                return;
            }

            if (list.Contains(name))
            {
                result.AddError(new CompilationMessage
                {
                    FilePath = method.OriginatingTree != null ? method.OriginatingTree.FilePath : null,
                    Location = DocumentLocation.FromTreeNode(method.OriginatingTree, method.OriginatingNode),
                    Message = "Method overloading is not supported. Consider using optional parameters, " +
                        "or providing an alternate name using the ScriptName attribute."
                });

                return;
            }

            list.Add(name);
        }
开发者ID:FlyingDeveloper,项目名称:blade,代码行数:31,代码来源:MethodOverloadValidator.cs


示例2: CreateFromExpression

		CodeAction CreateFromExpression(RefactoringContext context, Expression expression)
		{
			var resolveResult = context.Resolve(expression);
			if (resolveResult.IsError)
				return null;
			
			return new CodeAction(context.TranslateString("Extract method"), script => {
				string methodName = "NewMethod";
				var method = new MethodDeclaration() {
					ReturnType = context.CreateShortType(resolveResult.Type),
					Name = methodName,
					Body = new BlockStatement() {
						new ReturnStatement(expression.Clone())
					}
				};
				if (!StaticVisitor.UsesNotStaticMember(context, expression))
					method.Modifiers |= Modifiers.Static;
				var task = script.InsertWithCursor(context.TranslateString("Extract method"), Script.InsertPosition.Before, method);

				Action<Task> replaceStatements = delegate {
					var target = new IdentifierExpression(methodName);
					script.Replace(expression, new InvocationExpression(target));
					script.Link(target, method.NameToken);
				};

				if (task.IsCompleted) {
					replaceStatements (null);
				} else {
					task.ContinueWith (replaceStatements, TaskScheduler.FromCurrentSynchronizationContext ());
				}
			});
		}
开发者ID:adisik,项目名称:simple-assembly-explorer,代码行数:32,代码来源:ExtractMethodAction.cs


示例3: GeneratePartialClassContextStub

		static string GeneratePartialClassContextStub(ICodeContext context)
		{
			var member = context.CurrentMember;
			if (member == null)
				return "";
			var builder = new TypeSystemAstBuilder();
			MethodDeclaration decl;
			if (member is IMethod) {
				// If it's a method, convert it directly (including parameters + type parameters)
				decl = (MethodDeclaration)builder.ConvertEntity(member);
			} else {
				// Otherwise, create a method anyways, and copy the parameters
				decl = new MethodDeclaration();
				if (member is IParameterizedMember) {
					foreach (var p in ((IParameterizedMember)member).Parameters) {
						decl.Parameters.Add(builder.ConvertParameter(p));
					}
				}
			}
			decl.Name = "__DebuggerStub__";
			decl.ReturnType = builder.ConvertType(member.ReturnType);
			decl.Modifiers = member.IsStatic ? Modifiers.Static : Modifiers.None;
			// Make the method look like an explicit interface implementation so that it doesn't appear in CC
			decl.PrivateImplementationType = new SimpleType("__DummyType__");
			decl.Body = GenerateBodyFromContext(builder, context.LocalVariables.ToArray());
			return WrapInType(context.CurrentTypeDefinition, decl).ToString();
		}
开发者ID:kinpro,项目名称:SharpDevelop,代码行数:27,代码来源:CSharpLanguageBinding.cs


示例4: Complete

		public override void Complete(CompletionContext context)
		{
			var invokeSignature = delegateType.GetMethods(m => m.Name == "Invoke").Single();
			var refactoringContext = SDRefactoringContext.Create(context.Editor, CancellationToken.None);
			var builder = refactoringContext.CreateTypeSystemAstBuilder();
			var handlerName = eventDefinition.Name;
			
			var throwStatement = new ThrowStatement();
			var decl = new MethodDeclaration {
				ReturnType = refactoringContext.CreateShortType(invokeSignature.ReturnType),
				Name = handlerName,
				Body = new BlockStatement {
					throwStatement
				}
			};
			
			decl.Parameters.AddRange(invokeSignature.Parameters.Select(builder.ConvertParameter));
			
			if (eventDefinition.IsStatic)
				decl.Modifiers |= Modifiers.Static;
			
			throwStatement.Expression = new ObjectCreateExpression(refactoringContext.CreateShortType("System", "NotImplementedException"));
			
			// begin insertion
			using (context.Editor.Document.OpenUndoGroup()) {
				context.Editor.Document.Replace(context.StartOffset, context.Length, handlerName);
				context.EndOffset = context.StartOffset + handlerName.Length;
				
				using (var script = refactoringContext.StartScript()) {
					script.InsertWithCursor(this.DisplayText, Script.InsertPosition.Before, decl)
						// TODO : replace with Link, once that is implemented
						.ContinueScript(() => script.Select(throwStatement));
				}
			}
		}
开发者ID:Paccc,项目名称:SharpDevelop,代码行数:35,代码来源:EventCreationCompletionData.cs


示例5: AddPrivateImplementation

 public static void AddPrivateImplementation(Ast.AstType type, MethodDeclaration method)
 {
     if (privateImplementations.ContainsKey(type))
         privateImplementations[type].Add(method);
     else
         privateImplementations.Add(type, new List<MethodDeclaration>() { method });
 }
开发者ID:KAW0,项目名称:Alter-Native,代码行数:7,代码来源:Cache.cs


示例6: VisitMethodDeclaration

            public override void VisitMethodDeclaration(MethodDeclaration methodDeclaration)
            {
                // Only some methods are candidates for the warning

                if (methodDeclaration.Body.IsNull)
                    return;
                var methodResolveResult = ctx.Resolve(methodDeclaration) as MemberResolveResult;
                if (methodResolveResult == null)
                    return;
                var member = methodResolveResult.Member;
                if (member.IsOverride)
                    return;
                if (member.ImplementedInterfaceMembers.Any ())
                    return;
                if (usedDelegates.UsedMethods.Any (m => m.MemberDefinition == member))
                    return;
                if (currentTypeIsPartial && methodDeclaration.Parameters.Count == 2) {
                    if (methodDeclaration.Parameters.First().Name == "sender") {
                        // Looks like an event handler; the registration might be in the designer part
                        return;
                    }
                }
                foreach (var parameter in methodDeclaration.Parameters)
                    parameter.AcceptVisitor (this);
            }
开发者ID:Xiaoqing,项目名称:NRefactory,代码行数:25,代码来源:ParameterNotUsedIssue.cs


示例7: VisitMethodDeclaration

            public override object VisitMethodDeclaration(MethodDeclaration methodDeclaration, object data)
            {
                if (methodDeclaration.Modifiers.HasFlag(Modifiers.Abstract))
                    UnlockWith(methodDeclaration);

                return base.VisitMethodDeclaration(methodDeclaration, data);
            }
开发者ID:vlad2135,项目名称:strokes,代码行数:7,代码来源:AbstractMethod.cs


示例8: VisitMethodDeclaration

        public override void VisitMethodDeclaration(MethodDeclaration methodDeclaration)
        {
            Guard.AgainstNullArgument("methodDeclaration", methodDeclaration);

            IEnumerable<ParameterDeclaration> parameters = methodDeclaration
                .GetChildrenByRole(Roles.Parameter)
                .Select(x => (ParameterDeclaration)x.Clone());

            var isVoid = false;
            var isAsync = methodDeclaration.Modifiers.HasFlag(Modifiers.Async);
            AstType returnType = methodDeclaration.GetChildByRole(Roles.Type).Clone();
            var type = returnType as PrimitiveType;
            if (type != null)
            {
                isVoid = string.Compare(
                    type.Keyword, "void", StringComparison.OrdinalIgnoreCase) == 0;
            }

            var methodType = new SimpleType(Identifier.Create(isVoid ? "Action" : "Func"));

            IEnumerable<AstType> types = parameters.Select(
                x => x.GetChildByRole(Roles.Type).Clone());

            methodType
                .TypeArguments
                .AddRange(types);

            if (!isVoid)
            {
                methodType.TypeArguments.Add(returnType);
            }
            var methodName = GetIdentifierName(methodDeclaration);

            var methodBody = methodDeclaration
                .GetChildrenByRole(Roles.Body)
                .FirstOrDefault();
            if (methodBody == null)
            {
                throw new NullReferenceException(string.Format("Method '{0}' has no method body", methodName));
            }
            methodBody = (BlockStatement)methodBody.Clone();

            var prototype = new VariableDeclarationStatement { Type = methodType };
            prototype.Variables.Add(new VariableInitializer(methodName));

            var anonymousMethod = new AnonymousMethodExpression(methodBody, parameters) { IsAsync = isAsync };
            var expression = new ExpressionStatement
            {
                Expression = new AssignmentExpression(
                    new IdentifierExpression(methodName), 
                    anonymousMethod)
            };

            _methods.Add(new MethodVisitorResult
            {
                MethodDefinition = methodDeclaration,
                MethodPrototype = prototype,
                MethodExpression = expression
            });
        }
开发者ID:selony,项目名称:scriptcs,代码行数:60,代码来源:MethodVisitor.cs


示例9: GeneratePartialClassContextStub

		static string GeneratePartialClassContextStub(DebuggerCompletionContext context)
		{
			var compilation = SD.ParserService.GetCompilationForFile(context.FileName);
			var file = SD.ParserService.GetExistingUnresolvedFile(context.FileName);
			if (compilation == null || file == null)
				return "";
			var unresolvedMember = file.GetMember(context.Location);
			if (unresolvedMember == null)
				return "";
			var member = unresolvedMember.Resolve(new SimpleTypeResolveContext(compilation.MainAssembly));
			if (member == null)
				return "";
			var builder = new TypeSystemAstBuilder();
			MethodDeclaration decl;
			if (unresolvedMember is IMethod) {
				// If it's a method, convert it directly (including parameters + type parameters)
				decl = (MethodDeclaration)builder.ConvertEntity(member);
			} else {
				// Otherwise, create a method anyways, and copy the parameters
				decl = new MethodDeclaration();
				if (member is IParameterizedMember) {
					foreach (var p in ((IParameterizedMember)member).Parameters) {
						decl.Parameters.Add(builder.ConvertParameter(p));
					}
				}
			}
			decl.Name = "__DebuggerStub__";
			decl.ReturnType = builder.ConvertType(member.ReturnType);
			decl.Modifiers = unresolvedMember.IsStatic ? Modifiers.Static : Modifiers.None;
			// Make the method look like an explicit interface implementation so that it doesn't appear in CC
			decl.PrivateImplementationType = new SimpleType("__DummyType__");
			decl.Body = GenerateBodyFromContext(builder, context);
			return WrapInType(unresolvedMember.DeclaringTypeDefinition, decl).ToString();
		}
开发者ID:dgrunwald,项目名称:SharpDevelop,代码行数:34,代码来源:DebuggerDotCompletion.cs


示例10: ConvertInterfaceImplementation

		void ConvertInterfaceImplementation(MethodDeclaration member)
		{
			// members without modifiers are already C# explicit interface implementations, do not convert them
			if (member.Modifier == Modifiers.None)
				return;
			while (member.InterfaceImplementations.Count > 0) {
				InterfaceImplementation impl = member.InterfaceImplementations[0];
				member.InterfaceImplementations.RemoveAt(0);
				if (member.Name != impl.MemberName) {
					MethodDeclaration newMember = new MethodDeclaration {
						Name = impl.MemberName,
						TypeReference = member.TypeReference,
						Parameters = member.Parameters,
						Body = new BlockStatement()
					};
					InvocationExpression callExpression = new InvocationExpression(new IdentifierExpression(member.Name));
					foreach (ParameterDeclarationExpression decl in member.Parameters) {
						callExpression.Arguments.Add(new IdentifierExpression(decl.ParameterName));
					}
					if (member.TypeReference.Type == "System.Void") {
						newMember.Body.AddChild(new ExpressionStatement(callExpression));
					} else {
						newMember.Body.AddChild(new ReturnStatement(callExpression));
					}
					newMember.InterfaceImplementations.Add(impl);
					InsertAfterSibling(member, newMember);
				}
			}
		}
开发者ID:mgagne-atman,项目名称:Projects,代码行数:29,代码来源:ToCSharpConvertVisitor.cs


示例11: VisitMethodDeclaration

			public override void VisitMethodDeclaration (MethodDeclaration methodDeclaration)
			{
				base.VisitMethodDeclaration (methodDeclaration);

				// partial method
				if (methodDeclaration.Body.IsNull)
					return;

				var cfg = cfgBuilder.BuildControlFlowGraph (methodDeclaration.Body, ctx.Resolver,
					ctx.CancellationToken);
				var stack = new Stack<ControlFlowNode> ();
				var visitedNodes = new HashSet<ControlFlowNode> ();
				stack.Push (cfg [0]);
				while (stack.Count > 0) {
					var node = stack.Pop ();

					// reach method's end
					if (node.PreviousStatement == methodDeclaration.Body)
						return;
					// reach a return statement
					if (node.NextStatement is ReturnStatement ||
						node.NextStatement is ThrowStatement)
						return;

					foreach (var edge in node.Outgoing) {
						if (visitedNodes.Add(edge.To))
							stack.Push(edge.To);
					}
				}

				AddIssue (methodDeclaration.NameToken, 
					ctx.TranslateString ("Method never reaches its end or a 'return' statement."));
			}
开发者ID:Gobiner,项目名称:ILSpy,代码行数:33,代码来源:MethodNeverReturnsIssue.cs


示例12: VisitMethodDeclaration

		public override object VisitMethodDeclaration(MethodDeclaration methodDeclaration, object data)
		{
			Push();
			object result = base.VisitMethodDeclaration(methodDeclaration, data);
			Pop();
			return result;
		}
开发者ID:mgagne-atman,项目名称:Projects,代码行数:7,代码来源:PrefixFieldsVisitor.cs


示例13: VisitMethodDeclaration

            public override void VisitMethodDeclaration(MethodDeclaration methodDeclaration)
            {
                base.VisitMethodDeclaration (methodDeclaration);

                var resolveResult = ctx.Resolve (methodDeclaration) as MemberResolveResult;
                if (resolveResult == null)
                    return;
                var method = resolveResult.Member as IMethod;
                if (method == null)
                    return;

                if (method.Parameters.Count == 0 || !method.Parameters.Last ().IsOptional)
                    return;

                var overloads = method.DeclaringType.GetMethods(m => m.Name == method.Name && m.TypeParameters.Count == method.TypeParameters.Count)
                    .ToArray ();

                var parameterNodes = methodDeclaration.Parameters.ToArray();
                var parameters = new List<IParameter> ();
                for (int i = 0; i < method.Parameters.Count; i++) {
                    if (method.Parameters [i].IsOptional &&
                        overloads.Any (m => ParameterListComparer.Instance.Equals (parameters, m.Parameters))) {
                        AddIssue (parameterNodes [i].StartLocation, parameterNodes.Last ().EndLocation,
                            ctx.TranslateString ("Method with optional parameter is hidden by overload"));
                        break;
                    }
                    parameters.Add (method.Parameters [i]);
                }
            }
开发者ID:riviti,项目名称:NRefactory,代码行数:29,代码来源:MethodOverloadHidesOptionalParameterIssue.cs


示例14: VisitMethodDeclaration

            public override object VisitMethodDeclaration(MethodDeclaration methodDeclaration, object data)
            {
                if (methodDeclaration.IsExtensionMethod)
                    UnlockWith(methodDeclaration);

                return base.VisitMethodDeclaration(methodDeclaration, data);
            }
开发者ID:clausjoergensen,项目名称:strokes,代码行数:7,代码来源:ExtensionMethod.cs


示例15: VisitMethodDeclaration

            public override object VisitMethodDeclaration(MethodDeclaration methodDeclaration, object data)
            {
                if (methodDeclaration.Name.ToLower().Equals("main"))
                {
                    if (methodDeclaration.IsExtensionMethod == false &&
                        methodDeclaration.Modifiers.HasFlag(Modifiers.Static) &&
                        methodDeclaration.ReturnType.ToString() == "void")
                    {
                        var firstParam = methodDeclaration.Parameters.FirstOrDefault();

                        if (firstParam != null && firstParam.Type.ToString().ToLower() == "string[]")
                        {
                            // The following is a lesson in awesomeness:
                            //     Get all decendants of the method declaration that are IndexerExpressions,
                            //     which points to an identifier with the name [of our args variable]
                            var indexerIdentifierExpressions = methodDeclaration.Descendants
                                .OfType<IndexerExpression>()
                                .Select(a => a.Target)
                                .OfType<IdentifierExpression>();

                            if (indexerIdentifierExpressions.Any(a => a.Identifier == firstParam.Name))
                            {
                                UnlockWith(firstParam);
                            }
                        }
                    }
                }

                return base.VisitMethodDeclaration(methodDeclaration, data);
            }
开发者ID:cohenw,项目名称:strokes,代码行数:30,代码来源:ProgramWithStartupParamsAchievement.cs


示例16: GetActions

		public override IEnumerable<CodeAction> GetActions(RefactoringContext context)
		{
			var entity = context.GetNode<ConstructorDeclaration>();
			if (entity == null)
				yield break;
			var type = entity.Parent as TypeDeclaration;

			if (type == null || entity.Name == type.Name)
				yield break;

			var typeDeclaration = entity.GetParent<TypeDeclaration>();

			yield return new CodeAction(context.TranslateString("This is a constructor"), script => script.Replace(entity.NameToken, Identifier.Create(typeDeclaration.Name, TextLocation.Empty)), entity) {
				Severity = ICSharpCode.NRefactory.Refactoring.Severity.Error
			};

			yield return new CodeAction(context.TranslateString("This is a void method"), script => {
				var generatedMethod = new MethodDeclaration();
				generatedMethod.Modifiers = entity.Modifiers;
				generatedMethod.ReturnType = new PrimitiveType("void");
				generatedMethod.Name = entity.Name;
				generatedMethod.Parameters.AddRange(entity.Parameters.Select(parameter => (ParameterDeclaration)parameter.Clone()));
				generatedMethod.Body = (BlockStatement)entity.Body.Clone();
				generatedMethod.Attributes.AddRange(entity.Attributes.Select(attribute => (AttributeSection)attribute.Clone()));

				script.Replace(entity, generatedMethod);
			}, entity) {
				Severity = ICSharpCode.NRefactory.Refactoring.Severity.Error
			};
		}
开发者ID:0xb1dd1e,项目名称:NRefactory,代码行数:30,代码来源:CS1520MethodMustHaveAReturnTypeAction.cs


示例17: GetActions

		public IEnumerable<CodeAction> GetActions(RefactoringContext context)
		{
			VariableInitializer initializer;
			var eventDeclaration = GetEventDeclaration(context, out initializer);
			if (eventDeclaration == null) {
				yield break;
			}
			var type = (TypeDeclaration)eventDeclaration.Parent;
			if (type.Members.Any(m => m is MethodDeclaration && ((MethodDeclaration)m).Name == "On" + initializer.Name)) {
				yield break;
			}
			var resolvedType = context.Resolve(eventDeclaration.ReturnType).Type;
			if (resolvedType.Kind == TypeKind.Unknown) {
				yield break;
			}
			var invokeMethod = resolvedType.GetDelegateInvokeMethod();
			if (invokeMethod == null) {
				yield break;
			}
			yield return new CodeAction (context.TranslateString("Create event invocator"), script => {
				bool hasSenderParam = false;
				IEnumerable<IParameter> pars = invokeMethod.Parameters;
				if (invokeMethod.Parameters.Any ()) {
					var first = invokeMethod.Parameters [0];
					if (first.Name == "sender" /*&& first.Type == "System.Object"*/) {
						hasSenderParam = true;
						pars = invokeMethod.Parameters.Skip (1);
					}
				}
				const string handlerName = "handler";
						
				var arguments = new List<Expression> ();
				if (hasSenderParam)
					arguments.Add (new ThisReferenceExpression ());
				foreach (var par in pars)
					arguments.Add (new IdentifierExpression (par.Name));
				
				var methodDeclaration = new MethodDeclaration () {
					Name = "On" + initializer.Name,
					ReturnType = new PrimitiveType ("void"),
					Modifiers = ICSharpCode.NRefactory.CSharp.Modifiers.Protected | ICSharpCode.NRefactory.CSharp.Modifiers.Virtual,
					Body = new BlockStatement () {
						new VariableDeclarationStatement (eventDeclaration.ReturnType.Clone (), handlerName, new MemberReferenceExpression (new ThisReferenceExpression (), initializer.Name)),
						new IfElseStatement () {
							Condition = new BinaryOperatorExpression (new IdentifierExpression (handlerName), BinaryOperatorType.InEquality, new PrimitiveExpression (null)),
							TrueStatement = new ExpressionStatement (new InvocationExpression (new IdentifierExpression (handlerName), arguments))
						}
					}
				};
				
				foreach (var par in pars) {
					var typeName = context.CreateShortType (par.Type);
					var decl = new ParameterDeclaration (typeName, par.Name);
					methodDeclaration.Parameters.Add (decl);
				}
				
				script.InsertWithCursor (context.TranslateString("Create event invocator"), methodDeclaration, Script.InsertPosition.After);
			});
		}
开发者ID:KAW0,项目名称:Alter-Native,代码行数:59,代码来源:CreateEventInvocatorAction.cs


示例18: VisitMethodDeclaration

			public override void VisitMethodDeclaration(MethodDeclaration methodDeclaration)
			{
				var primitiveType = methodDeclaration.ReturnType as PrimitiveType;
				if (primitiveType == null || primitiveType.Keyword != "void")
					return;
				currentMethodName = methodDeclaration.Name;
				base.VisitMethodDeclaration(methodDeclaration);
			}
开发者ID:RainsSoft,项目名称:playscript-monodevelop,代码行数:8,代码来源:CS0127ReturnMustNotBeFollowedByAnyExpression.cs


示例19: VisitMethodDeclaration

            public override object VisitMethodDeclaration(MethodDeclaration methodDeclaration, object data)
            {
                var lines = methodDeclaration.Body.Sum(x => (x.EndLocation.Line - x.StartLocation.Line) + 1);
                if (lines >= 300)
                    UnlockWith(methodDeclaration);

                return base.VisitMethodDeclaration(methodDeclaration, data);
            }
开发者ID:clausjoergensen,项目名称:strokes,代码行数:8,代码来源:SomeFunnyAchievement.cs


示例20: VisitMethodDeclaration

 public override void VisitMethodDeclaration(MethodDeclaration methodDeclaration)
 {
     if (methodDeclaration.HasModifier(Modifiers.Static))
     {
         this.CheckDependency(methodDeclaration.ReturnType);
         base.VisitMethodDeclaration(methodDeclaration);
     }
 }
开发者ID:TinkerWorX,项目名称:Bridge,代码行数:8,代码来源:DependencyFinderVisitor.cs



注:本文中的MethodDeclaration类示例整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C# MethodDef类代码示例发布时间:2022-05-24
下一篇:
C# MethodData类代码示例发布时间:2022-05-24
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap