C# 在VisualStudio中有没有一种简单的方法来注释许多类和方法

C# 在VisualStudio中有没有一种简单的方法来注释许多类和方法,c#,visual-studio,C#,Visual Studio,我必须注释数百个类和数千个方法。 e、 g 必须换成 [DataContract] public class CompositeType { bool boolValue = true; string stringValue = "Hello "; [DataMember] public bool BoolValue { get { return boolValue;

我必须注释数百个类和数千个方法。 e、 g

必须换成

    [DataContract]
    public class CompositeType
    {
        bool boolValue = true;
        string stringValue = "Hello ";

        [DataMember]
        public bool BoolValue
        {
            get { return boolValue; }
            set { boolValue = value; }
        }

        [DataMember]
        public string StringValue
        {
            get { return stringValue; }
            set { stringValue = value; }
        }
    }

我怎样才能轻松地自动注释所有这些类/方法?仅供参考。。我确实安装了resharper,如果有人知道我如何使用它来帮助

您可以使用以下命令C快速向当前类及其属性添加属性:

public void Run(EnvDTE80.DTE2 DTE, Microsoft.VisualStudio.Shell.Package package) 
{
    EnvDTE.TextSelection ts = DTE.ActiveWindow.Selection as EnvDTE.TextSelection;
    if (ts == null)
        return;

    EnvDTE.CodeClass codeClass = ts.ActivePoint.CodeElement[EnvDTE.vsCMElement.vsCMElementClass]
        as EnvDTE.CodeClass;
    if (codeClass == null)
        return;

    codeClass.AddAttribute("DataContract", null);
    foreach(EnvDTE.CodeElement i in codeClass.Children)
    {
        if (i is EnvDTE.CodeProperty)
            (i as EnvDTE.CodeProperty).AddAttribute("DataMember", null);
    }
}

只需将插入符号放在类定义中,然后从VCmd菜单或使用键盘快捷键调用命令。

这是我的最终代码

using EnvDTE;
using EnvDTE80;
using System.Windows.Forms;
using System.Diagnostics;

public class C : VisualCommanderExt.ICommand
{
    public void Run(EnvDTE80.DTE2 DTE, Microsoft.VisualStudio.Shell.Package package) 
    {
        this.DTE = DTE;

        AnnotateAllInterfacesAndMethods("Console1");

    }


    private void AnnotateAllInterfacesAndMethods(string projectName)
    {
        var res = AllClasses(projectName);
        foreach (EnvDTE.CodeInterface c in res)
        { 
            //ADD attributes
            if (c.Attributes.Count == 0)
            {
                c.AddAttribute("System.ServiceModel.ServiceContract", $"Name=\"{c.Name}\"");                 
            }
            else  
            {
                bool broken = false;
                var items = c.Attributes.GetEnumerator();
                while (items.MoveNext())
                {
                    CodeElement value = (CodeElement)items.Current;

                    if (value.Name == "ServiceContract")
                    { 
                        broken = true;
                        break;
                    }
                }
                //service contract not found. So we add it.
                if (!broken)
                {
                    c.AddAttribute("System.ServiceModel.ServiceContract", $"Name=\"{c.Name}\"");                    
                }
            }


            if (c.Members.Count > 0)
            {
                foreach (EnvDTE.CodeElement m in c.Members)
                {
                    if (m.Kind == EnvDTE.vsCMElement.vsCMElementFunction)
                    {
                        var func = (m as EnvDTE.CodeFunction);

                        if (func.Attributes.Count == 0)
                        {
                            func.AddAttribute("System.ServiceModel.OperationContract", $"Name=\"{func.Name}\"");
                        }
                        else
                        {
                            bool broken = false;
                            var items = func.Attributes.GetEnumerator();
                            while (items.MoveNext())
                            {
                                CodeElement value = (CodeElement)items.Current;

                                if (value.Name == "OperationContract")
                                {
                                    broken = true;
                                    break;
                                }
                            }
                            //OperationContract not found. So we add it.
                            if (!broken)
                            {
                                func.AddAttribute("System.ServiceModel.OperationContract", $"Name=\"{func.Name}\"");
                            }
                        }

                    }
                }
            }
        }
        System.Windows.MessageBox.Show("Done");
    }

    private System.Collections.Generic.List<EnvDTE.CodeInterface> AllClasses(string projectName)
    {
        System.Collections.Generic.List<EnvDTE.CodeInterface> result = new System.Collections.Generic.List<EnvDTE.CodeInterface>();

        foreach (EnvDTE.Project p in DTE.Solution.Projects)
        { 
            if (projectName == p.Name)
            { 
                EnumerateProjectItems(p.ProjectItems, result);
            }
        }
        return result;
    }

    private void EnumerateProjectItems(EnvDTE.ProjectItems items, System.Collections.Generic.List<EnvDTE.CodeInterface> result)
    {
        foreach (EnvDTE.ProjectItem i in items)
        { 
            if (i.FileCodeModel != null && i.FileCodeModel.CodeElements != null)
            {

                foreach (EnvDTE.CodeElement n in i.FileCodeModel.CodeElements)
                { 
                    if (n.Kind == EnvDTE.vsCMElement.vsCMElementNamespace)
                    {
                        foreach (EnvDTE.CodeElement c in (n as EnvDTE.CodeNamespace).Members)
                        {
                            if (c.Kind == EnvDTE.vsCMElement.vsCMElementInterface)
                            { 
                                result.Add(c as EnvDTE.CodeInterface);
                            }
                        }
                    } 
                }
            }
            if (i.ProjectItems != null)
                EnumerateProjectItems(i.ProjectItems, result);
        }
    }

    private EnvDTE80.DTE2 DTE;
}

您可以将所有.cs文件作为文本打开,搜索模式,然后编辑文件。我在resharper中找不到添加重构功能的函数:这是一款很棒的软件:
using EnvDTE;
using EnvDTE80;
using System.Windows.Forms;
using System.Diagnostics;

public class C : VisualCommanderExt.ICommand
{
    public void Run(EnvDTE80.DTE2 DTE, Microsoft.VisualStudio.Shell.Package package) 
    {
        this.DTE = DTE;

        AnnotateAllInterfacesAndMethods("Console1");

    }


    private void AnnotateAllInterfacesAndMethods(string projectName)
    {
        var res = AllClasses(projectName);
        foreach (EnvDTE.CodeInterface c in res)
        { 
            //ADD attributes
            if (c.Attributes.Count == 0)
            {
                c.AddAttribute("System.ServiceModel.ServiceContract", $"Name=\"{c.Name}\"");                 
            }
            else  
            {
                bool broken = false;
                var items = c.Attributes.GetEnumerator();
                while (items.MoveNext())
                {
                    CodeElement value = (CodeElement)items.Current;

                    if (value.Name == "ServiceContract")
                    { 
                        broken = true;
                        break;
                    }
                }
                //service contract not found. So we add it.
                if (!broken)
                {
                    c.AddAttribute("System.ServiceModel.ServiceContract", $"Name=\"{c.Name}\"");                    
                }
            }


            if (c.Members.Count > 0)
            {
                foreach (EnvDTE.CodeElement m in c.Members)
                {
                    if (m.Kind == EnvDTE.vsCMElement.vsCMElementFunction)
                    {
                        var func = (m as EnvDTE.CodeFunction);

                        if (func.Attributes.Count == 0)
                        {
                            func.AddAttribute("System.ServiceModel.OperationContract", $"Name=\"{func.Name}\"");
                        }
                        else
                        {
                            bool broken = false;
                            var items = func.Attributes.GetEnumerator();
                            while (items.MoveNext())
                            {
                                CodeElement value = (CodeElement)items.Current;

                                if (value.Name == "OperationContract")
                                {
                                    broken = true;
                                    break;
                                }
                            }
                            //OperationContract not found. So we add it.
                            if (!broken)
                            {
                                func.AddAttribute("System.ServiceModel.OperationContract", $"Name=\"{func.Name}\"");
                            }
                        }

                    }
                }
            }
        }
        System.Windows.MessageBox.Show("Done");
    }

    private System.Collections.Generic.List<EnvDTE.CodeInterface> AllClasses(string projectName)
    {
        System.Collections.Generic.List<EnvDTE.CodeInterface> result = new System.Collections.Generic.List<EnvDTE.CodeInterface>();

        foreach (EnvDTE.Project p in DTE.Solution.Projects)
        { 
            if (projectName == p.Name)
            { 
                EnumerateProjectItems(p.ProjectItems, result);
            }
        }
        return result;
    }

    private void EnumerateProjectItems(EnvDTE.ProjectItems items, System.Collections.Generic.List<EnvDTE.CodeInterface> result)
    {
        foreach (EnvDTE.ProjectItem i in items)
        { 
            if (i.FileCodeModel != null && i.FileCodeModel.CodeElements != null)
            {

                foreach (EnvDTE.CodeElement n in i.FileCodeModel.CodeElements)
                { 
                    if (n.Kind == EnvDTE.vsCMElement.vsCMElementNamespace)
                    {
                        foreach (EnvDTE.CodeElement c in (n as EnvDTE.CodeNamespace).Members)
                        {
                            if (c.Kind == EnvDTE.vsCMElement.vsCMElementInterface)
                            { 
                                result.Add(c as EnvDTE.CodeInterface);
                            }
                        }
                    } 
                }
            }
            if (i.ProjectItems != null)
                EnumerateProjectItems(i.ProjectItems, result);
        }
    }

    private EnvDTE80.DTE2 DTE;
}