首页 > 解决方案 > 为什么在 Visual Studio Extensions VSIX 中,当我们为属性 GET/SET 添加属性时,当它适用于方法时,会出现错误

问题描述

此处代码遍历解决方案中的所有方法和属性,如果不存在则添加 [MethodImpl(MethodImplOptions.NoOptimization)] 属性。

仅在将属性添加到 Property Get/Set 时才会引发错误。属性被很好地添加到函数/方法中。

在下面的代码中,在这些行中抛出了一个错误。

codeFunctionGetPart.AddAttribute("MethodImpl", "MethodImplOptions.NoOptimization",0);

-和-

codeFunctionSetPart.AddAttribute("MethodImpl", "MethodImplOptions.NoOptimization",0);

整个代码如下。

请注意:变量名称在代码中是不言自明的。

            DTE2 dte = Package.GetGlobalService(typeof(DTE)) as DTE2;
            Solution solution = dte.Solution;
            foreach (Project fooProject in solution.Projects)
            {
                foreach (ProjectItem fooProjectItem in fooProject.ProjectItems)
                {
                    FileCodeModel2 fileCodeModel2 = fooProjectItem.FileCodeModel as FileCodeModel2;
                    if (fileCodeModel2 != null)
                    {
                        CodeElements codeElements = fileCodeModel2.CodeElements;

                        GoingThroughAllMethodsAndPropertiesAndAddNoOptimizationAttribute(codeElements);

                    }
                }
            }
        private void GoingThroughAllMethodsAndPropertiesAndAddNoOptimizationAttribute(CodeElements codeElements)
        {
            foreach (CodeElement fooCodeElement in codeElements)
            {
                if (fooCodeElement.Kind == vsCMElement.vsCMElementFunction)
                {
                    // This is for Function/Method
                    CodeFunction2 codeFunction2ForAttributes = (CodeFunction2)fooCodeElement;

                    bool isNoOptimizationAttributeExists = false;
                    foreach (CodeElement fooCodeElementAttribute in codeFunction2ForAttributes.Attributes)
                    {
                        TextPoint textPointStart = fooCodeElementAttribute.StartPoint;
                        TextPoint textPointEnd = fooCodeElementAttribute.EndPoint;

                        EditPoint editPoint_StartOfMethodCode = textPointStart.CreateEditPoint();
                        EditPoint editPoint_EndOfMethodCode = textPointEnd.CreateEditPoint();
                        string attributeText = editPoint_StartOfMethodCode.GetText(editPoint_EndOfMethodCode);

                        if (attributeText.Contains("NoOptimization"))
                        {
                            isNoOptimizationAttributeExists = true;
                        }
                    }

                    if (isNoOptimizationAttributeExists == false)
                    {
                        // !!!! THIS WORKS FINE
                        codeFunction2ForAttributes.AddAttribute("MethodImpl", "MethodImplOptions.NoOptimization", 0);
                    }
                }
                else if (fooCodeElement.Kind == vsCMElement.vsCMElementProperty)
                {
                    // This is for Property. It can be Getter or Setter of a property.
                    CodeProperty2 codeProperty = (CodeProperty2)fooCodeElement;

                    CodeFunction codeFunctionGetPart = codeProperty.Getter;
                    CodeFunction codeFunctionSetPart = codeProperty.Setter;
                    if (codeFunctionGetPart != null)
                    {
                        // If Property Getter Exists.
                        
                        bool isNoOptimizationAttributeExists = false;
                        foreach (CodeElement fooCodeElementAttribute in codeFunctionGetPart.Attributes)
                        {
                            TextPoint textPointStart = fooCodeElementAttribute.StartPoint;
                            TextPoint textPointEnd = fooCodeElementAttribute.EndPoint;

                            EditPoint editPoint_StartOfMethodCode = textPointStart.CreateEditPoint();
                            EditPoint editPoint_EndOfMethodCode = textPointEnd.CreateEditPoint();
                            string attributeText = editPoint_StartOfMethodCode.GetText(editPoint_EndOfMethodCode);

                            if (attributeText.Contains("NoOptimization"))
                            {
                                isNoOptimizationAttributeExists = true;
                            }
                        }

                        if (isNoOptimizationAttributeExists == false)
                        {
                            // !!!!!!!!!!!! THIS Adding of Attribute to 'Get' Part of property IS GIVING ERROR !!!!!!!!!!!!!!!!!!!
                            // !!!!!!!!!!!! THIS Adding of Attribute to 'Get' Part of property IS GIVING ERROR !!!!!!!!!!!!!!!!!!!
                            codeFunctionGetPart.AddAttribute("MethodImpl", "MethodImplOptions.NoOptimization",0);
                        }
                    }

                    if (codeFunctionSetPart != null)
                    {
                        // If Property Setter Exists.

                        bool isNoOptimizationAttributeExists = false;
                        foreach (CodeElement fooCodeElementAttribute in codeFunctionSetPart.Attributes)
                        {
                            TextPoint textPointStart = fooCodeElementAttribute.StartPoint;
                            TextPoint textPointEnd = fooCodeElementAttribute.EndPoint;

                            EditPoint editPoint_StartOfMethodCode = textPointStart.CreateEditPoint();
                            EditPoint editPoint_EndOfMethodCode = textPointEnd.CreateEditPoint();
                            string attributeText = editPoint_StartOfMethodCode.GetText(editPoint_EndOfMethodCode);

                            if (attributeText.Contains("NoOptimization"))
                            {
                                isNoOptimizationAttributeExists = true;
                            }
                        }

                        if (isNoOptimizationAttributeExists == false)
                        {
                            // !!!!!!!!!!!! THIS Adding of Attribute to 'Set' Part of property IS GIVING ERROR !!!!!!!!!!!!!!!!!!!
                            // !!!!!!!!!!!! THIS Adding of Attribute to 'Set' Part of property IS GIVING ERROR !!!!!!!!!!!!!!!!!!!
                            codeFunctionSetPart.AddAttribute("MethodImpl", "MethodImplOptions.NoOptimization", 0);
                        }
                    }
                }
                else
                {
                    if (fooCodeElement.Children != null)
                        GoingThroughAllMethodsAndPropertiesAndAddNoOptimizationAttribute(fooCodeElement.Children);
                }
            }
        }

标签: c#visual-studio-extensionsvsix

解决方案


推荐阅读