【问题标题】:Code Snippet to automatically create getter/setter?自动创建getter/setter的代码片段?
【发布时间】:2011-05-17 19:23:25
【问题描述】:

我曾经使用过我在过去看到/找到的代码 sn-p,它将我的单个语句变成私有/公共 getter/setter,自从重新安装我的机器后,我至今无法重复该发现。

例如:

private string serverSMTP = string.empty;

然后我可以按 Ctrl k + 并把它变成这样:

        private string serverSMTP = string.Empty;
    public string ServerSMTP
    {
        get { return serverSMTP; }
        set
        {
            serverSMTP = value;
            RaisePropertyChanged("ServerSMTP");
        }
    }

我有什么想法可以创建一些东西来做到这一点或扩展/sn-p 来为我处理它吗?在较大的项目中,这将为我节省大量时间。

【问题讨论】:

  • 这和 mvvm 和 wpf 有关系吗?
  • 我还没有看到它在 setter 中使用 RaisePropertyChanged 调用完成。但是,您可能有一个插件将此行为添加到 vs。对不起,我没有帮助.. 但我知道您可以这样做: public string ServerSMTP { get;放; }

标签: wpf visual-studio-2010 mvvm-light


【解决方案1】:

如果您已经在使用 MVVM Light 框架,您可以安装它附带的代码 sn-ps 来执行类似的操作。具体来说,“mvvminpc”sn-p 将执行您要查找的操作,尽管它不会采用现有字段声明并将其转换为带有 propertychanged 通知的属性。

http://mvvmlight.codeplex.com/sourcecontrol/latest#Installer/InstallItems/Snippets/CSharp/mvvmInpc.snippet

编写 sn-ps 代码以加快添加新属性的速度(仅限 Visual Studio):
mvvminpc 向 ViewModel 添加了一个新的可绑定属性。
mvvmlocatorproperty 将新的 ViewModel 添加到 ViewModeLocator。
mvvmpropa 将新的附加属性添加到 DependencyObject(仅限 WPF)。
mvvmpropdp 将新的依赖属性添加到 DependencyObject(仅限 WPF)。
mvvmslpropa 将新的附加属性添加到 DependencyObject(仅限 Silverlight)。
mvvmslpropdp 将新的依赖属性添加到 DependencyObject(仅限 Silverlight)。

【讨论】:

    【解决方案2】:

    把这个sn-p:

    <?xml version="1.0" encoding="utf-8"?>
    <CodeSnippets
        xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
        <CodeSnippet Format="1.0.0">
            <Header>
                <Shortcut>propn</Shortcut>
                <Title>
                    Notify Property
                </Title>
            </Header>
            
            <Snippet>
                <Declarations>
                    <Literal>
                        <ID>type</ID>
                        <ToolTip>Type</ToolTip>
                        <Default>int</Default>
                    </Literal>
                    <Literal>
                        <ID>field</ID>
                        <ToolTip>Field name</ToolTip>
                        <Default>fieldName</Default>
                    </Literal>
                    <Literal>
                        <ID>property</ID>
                        <ToolTip>Propery Name</ToolTip>
                        <Default>PropertyName</Default>
                    </Literal>
                </Declarations>
    
                <Code Language="CSharp">
                    <![CDATA[       
    private $type$ $field$;
    public $type$ $property$
    {
        get { return $field$; }
        set
        {
            if($field$ != value)
            {
                $field$ = value;
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("$property$"));
            }
        }
    }
    $end$]]>
                </Code>
            </Snippet>
        </CodeSnippet>
    </CodeSnippets>
    

    在一个文件 propn.sn-p 中,在这个文件夹中: C:\Users[YOUR_USERNAME]\Documents\Visual Studio 2010\Code Snippets\Visual C#\My Code Snippets

    然后你就可以通过 (propn + tab + tab) 快捷方式使用这个 sn-p。

    sn-p xml 很容易自己理解,因此您可以轻松地将其调整为您需要的任何内容。

    【讨论】:

    • 在任何情况下都不应引发事件,但前提是属性实际发生变化,因此应检查field != value
    • 您可以通过“自动化”此代码来节省更多精力:codeproject.com/KB/codegen/CodeSnippetAutomation.aspx
    • 这不是破坏事物而是干净编码的问题,如果有人订阅了一个名为 PropertyChanged 的事件,那么该人应该能够假设如果 属性更改,则该属性被触发.
    • sn-p 可以从头开始创建它,但我想采用我已经编写的内容(私有字符串 serverSMTP = string.empty 并使用该行添加公共 getter/setter有所有额外的信息吗?
    • 另外,您的 sn-p 中有一个竞争条件,其中 PropertyChanged 在您的空检查和调用它之间可能会被取消订阅。最好将其分配给变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-03
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 2010-09-11
    • 1970-01-01
    相关资源
    最近更新 更多