c# - 为什么在 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);
}
}
}
解决方案
推荐阅读
- python - Pydrive 身份验证不起作用 httplib.ResponseNotReady
- http-status-code-404 - 如何在 Dash (plotly) 中创建 404 错误页面?
- javascript - 来自 API 的数据未在 React-Redux 应用程序的 Store (Reducer) 中更新
- vue.js - 在Vuex中按下按钮时如何将数据表单插入表格?
- angular - 我们如何在 Ionic 3 的帮助下安全地将访问令牌存储在存储中?
- virtual-memory - 禁用虚拟内存时如何在 RISC-V 32 位系统中访问 34 位物理地址空间?
- javascript - 如何在 wordpress 菜单项中添加 onclick 功能以显示页面部分(显示:无;)
- permissions - 使用服务帐户时如何防止“交付状态通知(失败)”
- batch-file - 有没有办法在cmd中设置只读(const)变量?
- php - 如何在输入中每个月添加链接(输入月份)