【问题标题】:Is there a way, at design time, to initialize an object with all properties in Visual Studio 2010?有没有办法在设计时用 Visual Studio 2010 中的所有属性初始化对象?
【发布时间】:2012-01-31 16:44:14
【问题描述】:

背景

我正在用 VS 2010、.NET 4、C# 编写代码。此外,万一这很重要,我使用的是最新版本的 ReSharper。

问题

假设我有这个模型:

public class SomeObject
        {
            public string Red{ get; set; }
            public string Green{ get; set; }
            public string Blue{ get; set; }
            public string Yellow{ get; set; }
            public string Purple{ get; set; }
            public string Orange{ get; set; }
            public string Black{ get; set; }
        }

在代码的其他地方,我需要实例化这些对象之一,如下所示:

SomeObject myObject = new SomeObject{
                                     red = "some value", 
                                     blue = "some other value",
                                     . . .,
                                     black="last value"
                                    };

*注意:*我有时希望只使用其全部可能属性的子集(即只有红色和蓝色)来初始化此对象。

目前,我必须为SomeObject 的每个新实例输入每个属性(红色、蓝色、绿色等)。 VS2010 中是否有热键或其他东西可以预先填充这些属性,所以我只需为每个属性分配值而不是输入每个值?

【问题讨论】:

标签: c# visual-studio-2010 resharper


【解决方案1】:

您可以使用智能代码完成。

写: 新的一些对象{

然后按 Ctrl+Alt+Space: -> 所有可能的属性都列在工具提示窗口中

然后选择一个属性(即“红色”)并按 ENTER -> 新的 SomeObject{Red = }

然后输入“,”并再次按Ctrl+Alt+Space,选择下一个属性等等。

【讨论】:

    【解决方案2】:

    目前,我必须为 SomeObject 的每个新实例输入每个属性(红色、蓝色、绿色等)。

    就个人而言,如果您需要为每个对象实例设置这些,我会通过添加一个接受所有参数的构造函数来处理这个问题,而不是使用对象初始化语法。这将为您提供完整的智能感知,但也帮助/强制您每次正确构造对象。

    请记住,类型的构造函数应该强制您提供将对象正确初始化为适当状态所需的所有参数。对象初始化器的一个缺点是它们不会在编译时强制执行此操作。因此,如果所有这些属性对于每个对象实例都是必需的,则构造函数应该提供它们而不是使用对象初始值设定项。

    【讨论】:

    • 除了构造函数外,您必须传入每个参数,即使您只想填充,例如红色和黄色。除非您为所有可能的组合重载构造函数。这取决于您的用途。
    • @Scottie 是的 - 但 OP 明确指出“我必须为 SomeObject 的每个新实例输入每个属性(红色、蓝色、绿色等)。”在这种情况下,听起来构造函数是正确的方法。
    • 大家早上好,感谢您的想法。 REED:构造函数听起来像 正确 方法;然而,正如 Scottie 所说,有时我只想用其全部可能属性的一个子集来初始化 SomeObject。我应该在 OP 中对此更清楚,但无论如何,这是不好的做法吗?谢谢!
    • @MatthewPatrickCashatt 您可以拥有多个构造函数。您的构造函数应始终将对象置于有效状态 - 因此至少强制构造函数设置所需的最低属性。我将拥有尽可能多的构造函数,因此我总是制作“正确”的对象(没有对象初始化器),然后根据需要使用对象初始化器来设置其他属性。
    • 请注意,这在 C# 4 中也容易得多,因为您可以在构造函数中使用可选参数和命名参数。您可以使用具有默认值的构造函数,并根据需要进行覆盖——甚至在特殊情况下使用命名参数来覆盖。
    【解决方案3】:

    所有属性总是相同的吗? 为什么不在已经设置好的地方添加构造函数呢?或者不止一个。

    【讨论】:

      【解决方案4】:

      看看代码片段。我想这会给你你想要的。

      【讨论】:

      • 虽然使用允许他继续做他正在做的事情的代码片段,但这并不意味着他正在做的事情是正确的,使用类构造函数是一个更好的主意。
      • @Ramhound 除非,当然,你不能写构造函数
      【解决方案5】:

      一般来说没有键盘快捷键来准备对象初始化器。

      VS IDE 或 Reshaper 无法对您希望将属性设置为的值做出合理的猜测,因此必须插入无效或充其量是次优代码。

      您可以实施一个特定的解决方案,正如其他答案所暗示的那样,如果您发现自己重复地这样做,构造函数可能是要走的路,但我不认为这是您的问题。

      【讨论】:

      • 实际上 ReSharper 在生成新属性时已经做了类似的事情——它为值类型、名称和 ??? getter/setter 代码的占位符创建了一个带有“突出显示”编辑点的模板,所以有“没有理由”它不能在爆炸实例初始化时做同样的事情。
      【解决方案6】:

      你真的想要读/写颜色吗?如果没有,这是最简单的解决方案:

      public class SomeObject
      { 
          public const string Red = "red";
          public const string Green = "green";
          public const string Blue = "blue";
          ...
      }
      

      但是,如果您想更加灵活,并且只能初始化一些属性,您可以使用对象初始化语法。使用您原来的 SomeObject 实现,您可以创建一个新对象:

      var obj = new SomeObject { Red = "red", Blue = "blue" };
      

      【讨论】:

        【解决方案7】:

        我创建了一个 VS 宏来执行此操作。我的主要用途是为我的 DTO 生成虚拟测试数据。

        你写这样一行:

        var x = new SomeType();
        

        然后宏将为每个可写属性/成员生成一行

        x.IntProperty = 0;
        x.StringProperty = "StringProperty";
        x.DateProperty = new DateTime(2012, 1, 31);
        x.SomeIntList = new List<int>();
        x.SomeTypeProperty = new SomeType();
        

        (当然你也可以在最后一行重新运行宏来生成x.SomeTypeProperty.Y = 0等)

        Option Explicit On
        Option Strict On
        Imports System
        Imports EnvDTE
        Imports EnvDTE80
        Imports System.Collections.Generic
        Imports System.Linq
        Imports System.Text.RegularExpressions
        Imports System.Windows.Forms
        
        Friend Module InitializeAllMembers
            Public DTE As EnvDTE80.DTE2
            Private ReadOnly _usings As New HashSet(Of String)
        
            Sub InitializeAllMembers(ByVal getValue As Boolean)
                Try
                    Dim memberAssignment As Func(Of String, String, String, EnvDTE.CodeTypeRef, String) = Nothing
                    Dim selection As EnvDTE.TextSelection = CType(DTE.ActiveDocument.Selection(), EnvDTE.TextSelection)
                    Dim editPoint As EditPoint = selection.BottomPoint.CreateEditPoint
        
                    editPoint.StartOfLine()
        
                    Dim className As String = ""
                    Dim indent As String = ""
                    Dim variable As String = ""
                    Dim parseError As String
        
                    If DTE.ActiveDocument.ProjectItem Is Nothing Then
                        MessageBox.Show("File does not belong to a project")
                    End If
        
                    If DTE.ActiveDocument.Language = "Basic" Then
                        parseError = GetVbInitialization(editPoint.GetText(editPoint.LineLength), className, indent, variable)
                        If getValue Then
                            memberAssignment = AddressOf VbMemberGetValue
                        Else
                            memberAssignment = AddressOf VbMemberAssignment
                        End If
                    ElseIf DTE.ActiveDocument.Language = "CSharp" Then
                        parseError = GetCSharpInitialization(editPoint.GetText(editPoint.LineLength), className, indent, variable)
                        If getValue Then
                            memberAssignment = AddressOf CSharpMemberGetValue
                        Else
                            memberAssignment = AddressOf CSharpMemberAssignment
                        End If
                    Else
                        parseError = "Not supported language " & DTE.ActiveDocument.Language
                    End If
        
                    If parseError IsNot Nothing Then
                        MessageBox.Show(parseError)
                        Exit Sub
                    End If
        
                    Dim currentFunction As CodeElement = FindCodeElement(selection.ActivePoint, DTE.ActiveDocument.ProjectItem.FileCodeModel.CodeElements)
                    If currentFunction Is Nothing Then
                        MessageBox.Show("Can't find current function")
                        Exit Sub
                    End If
                    _usings.Clear()
                    FindAllUsings(currentFunction)
        
                    Dim classType As CodeElement = DTE.Solution.Projects.Cast(Of Project) _
                                                                        .Select(Function(x) FindClassInProjectItems(x.ProjectItems, className)) _
                                                                        .FirstOrDefault(Function(x) x IsNot Nothing)
        
                    If classType Is Nothing Then
                        MessageBox.Show("Can't find type in solution: " & className)
                        Exit Sub
                    End If
        
                    DTE.UndoContext.Open("InitializeAllMembers")
                    PrintMemberAssignments(memberAssignment, editPoint, indent, variable, GetMembers(classType))
                    If TypeOf classType Is CodeClass Then
                        For Each base As CodeElement In CType(classType, CodeClass).Bases
                            If TypeOf base Is CodeClass Then
                                PrintMemberAssignments(memberAssignment, editPoint, indent, variable, GetMembers(base))
                            End If
                        Next
                    End If
                    DTE.UndoContext.Close()
                Catch objException As System.Exception
                    MessageBox.Show(objException.Message)
                End Try
            End Sub
        
            Private Function GetVbInitialization(ByVal line As String, _
                                                 ByRef className As String, _
                                                 ByRef indent As String, _
                                                 ByRef variable As String) As String
                Dim vbinitialization As New Regex("(?<Indent>\s*)Dim\s+(?<VariableName>[\S=]+)\s+(?:As\s+(?:New\s+)?(?<DeclaredType>[^\s\(]+))?(?:\s*=\s*New\s+(?<CreatedType>[^\s\(]+))?", _
                                                  RegexOptions.IgnoreCase)
                Dim match As Match = vbinitialization.Match(line)
                If Not match.Success Then
                    Return "No assignment on row"
                End If
                Dim foundDeclaredType As Boolean = match.Groups("DeclaredType").Success
                Dim foundCreatedType As Boolean = match.Groups("CreatedType").Success
                If Not (foundDeclaredType OrElse foundCreatedType) Then
                    Return "Can't find type on row"
                End If
                className = If(foundDeclaredType, match.Groups("DeclaredType"), match.Groups("CreatedType")).Value
                indent = match.Groups("Indent").Value
                variable = match.Groups("VariableName").Value
                Return Nothing
            End Function
        
            Private Function GetCSharpInitialization(ByVal line As String, _
                                                     ByRef className As String, _
                                                     ByRef indent As String, _
                                                     ByRef variable As String) As String
                Dim csharpinitialization As New Regex("(?<Indent>\s*)(?:(?<DeclaredType>\S+)\s+)?(?<VariableName>[\S=]+)\s*=\s*(?<new>new)?\s*(?<CreatedType>[^\s\(]+)")
                Dim match As Match = csharpinitialization.Match(line)
                If Not match.Success Then
                    Return "No assignment on row"
                End If
                Dim foundDeclaredType As Boolean = match.Groups("DeclaredType").Success AndAlso match.Groups("DeclaredType").Value <> "var"
                Dim foundCreatedType As Boolean = match.Groups("new").Success
                If Not (foundDeclaredType OrElse foundCreatedType) Then
                    Return "Can't find type on row"
                End If
                className = If(foundDeclaredType, match.Groups("DeclaredType"), match.Groups("CreatedType")).Value
                indent = match.Groups("Indent").Value
                variable = match.Groups("VariableName").Value
                Return Nothing
            End Function
        
            Sub FindAllUsings(ByVal elem As Object)
                If TypeOf elem Is CodeFunction Then
                    FindAllUsings(CType(elem, CodeFunction).Parent)
                ElseIf TypeOf elem Is CodeClass Then
                    _usings.Add(CType(elem, CodeClass).FullName)
                    FindAllUsings(CType(elem, CodeClass).Parent)
                ElseIf TypeOf elem Is CodeStruct Then
                    _usings.Add(CType(elem, CodeStruct).FullName)
                    FindAllUsings(CType(elem, CodeStruct).Parent)
                ElseIf TypeOf elem Is CodeNamespace Then
                    _usings.Add(CType(elem, CodeNamespace).FullName)
                    For Each ns As String In CType(elem, CodeNamespace).Members.OfType(Of CodeImport) _
                                                                               .Select(Function(x) x.Namespace)
                        _usings.Add(ns)
                    Next
                    FindAllUsings(CType(elem, CodeNamespace).Parent)
                ElseIf TypeOf elem Is FileCodeModel Then
                    For Each ns As String In CType(elem, FileCodeModel).CodeElements.OfType(Of CodeImport) _
                                                                                    .Select(Function(x) x.Namespace)
                        _usings.Add(ns)
                    Next
                End If
            End Sub
        
            Public Function FindCodeElement(ByVal caretPosition As TextPoint, ByVal elems As CodeElements) As CodeElement
                If elems Is Nothing Then Return Nothing
                Return elems.Cast(Of CodeElement) _
                            .Where(Function(x) x.StartPoint.LessThan(caretPosition) AndAlso _
                                               x.EndPoint.GreaterThan(caretPosition)) _
                            .Select(Function(x) If(FindCodeElement(caretPosition, GetMembers(x)), x)) _
                            .FirstOrDefault()
            End Function
        
            Public Sub PrintMemberAssignments(ByVal memberAssignment As Func(Of String, String, String, CodeTypeRef, String), _
                                              ByVal editPoint As EditPoint, _
                                              ByVal indent As String, _
                                              ByVal variable As String, _
                                              ByVal members As CodeElements)
                For Each member As CodeElement In members
                    Dim typeref As EnvDTE.CodeTypeRef
                    If TypeOf member Is CodeProperty2 Then
                        Dim prop As CodeProperty2 = CType(member, CodeProperty2)
                        If prop.Setter Is Nothing Then
                            If prop.Access <> vsCMAccess.vsCMAccessPublic Then Continue For
                            If prop.ReadWrite = vsCMPropertyKind.vsCMPropertyKindReadOnly Then Continue For
                            If prop.IsShared Then Continue For
                        ElseIf prop.Setter.Access <> vsCMAccess.vsCMAccessPublic Then
                            Continue For
                        ElseIf prop.Setter.IsShared Then
                            Continue For
                        End If
                        typeref = prop.Type
                    ElseIf TypeOf member Is CodeVariable Then
                        Dim var As CodeVariable = CType(member, CodeVariable)
                        If var.Access <> vsCMAccess.vsCMAccessPublic Then Continue For
                        If var.IsConstant Then Continue For
                        If var.IsShared Then Continue For
                        typeref = var.Type
                    Else
                        Continue For
                    End If
        
                    editPoint.EndOfLine()
                    editPoint.Insert(ControlChars.NewLine)
                    editPoint.Insert(memberAssignment(indent, variable, member.Name, typeref))
                Next
            End Sub
        
            Private Function TrimKnownNamespace(ByVal fullName As String) As String
                Return fullName.Substring(_usings.Where(Function(x) fullName.StartsWith(x) AndAlso _
                                                                    fullName.Length > x.Length AndAlso _
                                                                    fullName(x.Length) = "."c) _
                                             .Select(Function(x) x.Length + 1) _
                                             .DefaultIfEmpty(0) _
                                             .Max())
            End Function
        
            Private Function FindClassInProjectItems(ByVal nprojectItems As ProjectItems, ByVal classname As String) As CodeElement
                If nprojectItems Is Nothing Then Return Nothing
                For Each nprojectitem As ProjectItem In nprojectItems
                    Dim found As CodeElement
                    If nprojectitem.Kind = EnvDTE.Constants.vsProjectItemKindPhysicalFile Then
                        If nprojectitem.FileCodeModel Is Nothing Then Continue For
                        found = FindClassInCodeElements(nprojectitem.FileCodeModel.CodeElements, classname)
                        If found IsNot Nothing Then Return found
                    End If
                    If nprojectitem.SubProject IsNot Nothing Then
                        found = FindClassInProjectItems(nprojectitem.SubProject.ProjectItems, classname)
                        If found IsNot Nothing Then Return found
                    End If
                    found = FindClassInProjectItems(nprojectitem.ProjectItems, classname)
                    If found IsNot Nothing Then Return found
                Next
                Return Nothing
            End Function
        
            Private Function FindClassInCodeElements(ByVal elems As CodeElements, ByVal classname As String) As CodeElement
                If elems Is Nothing Then Return Nothing
                For Each elem As CodeElement In elems
                    If IsClassType(elem) Then
                        If classname = elem.Name Then Return elem
                    ElseIf Not TypeOf elem Is CodeNamespace Then
                        Continue For
                    End If
                    If _usings.Contains(elem.FullName) Then
                        Dim found As CodeElement = FindClassInCodeElements(GetMembers(elem), classname)
                        If found IsNot Nothing Then Return found
                    End If
                Next
                Return Nothing
            End Function
        
            Private Function GetMembers(ByVal elem As CodeElement) As CodeElements
                If TypeOf elem Is CodeClass Then
                    Return CType(elem, CodeClass).Members
                ElseIf TypeOf elem Is CodeNamespace Then
                    Return CType(elem, CodeNamespace).Members
                ElseIf TypeOf elem Is CodeStruct Then
                    Return CType(elem, CodeStruct).Members
                ElseIf TypeOf elem Is CodeInterface Then
                    Return CType(elem, CodeInterface).Members
                End If
                Return Nothing
            End Function
        
            Private Function IsClassType(ByVal elem As CodeElement) As Boolean
                Return TypeOf elem Is CodeClass OrElse TypeOf elem Is CodeStruct OrElse TypeOf elem Is CodeInterface
            End Function
        
            Private Function CSharpMemberAssignment(ByVal indent As String, _
                                                    ByVal variable As String, _
                                                    ByVal membername As String, _
                                                    ByVal typeref As EnvDTE.CodeTypeRef) As String
                Dim typekind As EnvDTE.vsCMTypeRef = typeref.TypeKind
                Dim value As String
                If typekind = vsCMTypeRef.vsCMTypeRefArray Then
                    value = "{0}{1}.{2} = new {3}[1];"
                    Return String.Format(value, indent, variable, membername, TrimKnownNamespace(typeref.ElementType.AsString)) & _
                           ControlChars.NewLine & _
                           CSharpMemberAssignment(indent, variable, membername & "[0]", typeref.ElementType)
                ElseIf typekind = vsCMTypeRef.vsCMTypeRefBool Then
                    value = "false"
                ElseIf typekind = vsCMTypeRef.vsCMTypeRefChar Then
                    value = "'x'"
                ElseIf typekind = vsCMTypeRef.vsCMTypeRefDecimal Then
                    value = "0.00m"
                ElseIf typekind = vsCMTypeRef.vsCMTypeRefDouble Then
                    value = "0.00"
                ElseIf typekind = vsCMTypeRef.vsCMTypeRefInt Then
                    value = "0"
                ElseIf typekind = vsCMTypeRef.vsCMTypeRefLong Then
                    value = "0"
                ElseIf typekind = vsCMTypeRef.vsCMTypeRefShort Then
                    value = "0"
                ElseIf typekind = vsCMTypeRef.vsCMTypeRefByte Then
                    value = "0"
                ElseIf typekind = vsCMTypeRef.vsCMTypeRefString Then
                    value = """" & membername & """"
                ElseIf typekind = vsCMTypeRef.vsCMTypeRefCodeType AndAlso _
                        typeref.AsString = "System.DateTime" Then
                    value = String.Format("new DateTime({0:yyyy}, {0:%M}, {0:%d})", DateTime.Today)
                Else
                    value = "new " & TrimKnownNamespace(typeref.AsString) & "()"
                End If
                Return String.Format("{0}{1}.{2} = {3};", indent, variable, membername, value)
            End Function
        
            Private Function CSharpMemberGetValue(ByVal indent As String, _
                                                  ByVal variable As String, _
                                                  ByVal membername As String, _
                                                  ByVal typeref As EnvDTE.CodeTypeRef) As String
                Dim typekind As EnvDTE.vsCMTypeRef = typeref.TypeKind
                Dim value As String
                If typekind = vsCMTypeRef.vsCMTypeRefArray Then
                    value = "{0}{1}.{2} = new {3}[1];"
                    Return String.Format(value, indent, variable, membername, TrimKnownNamespace(typeref.ElementType.AsString)) & _
                           ControlChars.NewLine & _
                           CSharpMemberGetValue(indent, variable, membername & "[0]", typeref.ElementType)
                ElseIf typekind = vsCMTypeRef.vsCMTypeRefBool Then
                    value = "src.GetBoolean()"
                ElseIf typekind = vsCMTypeRef.vsCMTypeRefChar Then
                    value = "src.GetChar()"
                ElseIf typekind = vsCMTypeRef.vsCMTypeRefDecimal Then
                    value = "src.GetDecimal()"
                ElseIf typekind = vsCMTypeRef.vsCMTypeRefDouble Then
                    value = "src.GetDouble()"
                ElseIf typekind = vsCMTypeRef.vsCMTypeRefInt Then
                    value = "src.GetInt32()"
                ElseIf typekind = vsCMTypeRef.vsCMTypeRefLong Then
                    value = "src.GetInt64()"
                ElseIf typekind = vsCMTypeRef.vsCMTypeRefShort Then
                    value = "src.GetInt16()"
                ElseIf typekind = vsCMTypeRef.vsCMTypeRefByte Then
                    value = "src.GetByte()"
                ElseIf typekind = vsCMTypeRef.vsCMTypeRefString Then
                    value = "src.GetString()"
                ElseIf typekind = vsCMTypeRef.vsCMTypeRefCodeType AndAlso _
                        typeref.AsString = "System.DateTime" Then
                    value = "src.GetDateTime()"
                Else
                    value = "new " & TrimKnownNamespace(typeref.AsString) & "()"
                End If
                Return String.Format("{0}{1}.{2} = {3};", indent, variable, membername, value)
            End Function
        
            Private Function VbMemberAssignment(ByVal indent As String, _
                                                ByVal variable As String, _
                                                ByVal membername As String, _
                                                ByVal typeref As EnvDTE.CodeTypeRef) As String
                Dim typekind As EnvDTE.vsCMTypeRef = typeref.TypeKind
                Dim value As String
                If typekind = vsCMTypeRef.vsCMTypeRefArray Then
                    value = "{0}Redim {1}.{2}(1)" ' Vb don't need type argument
                    Return String.Format(value, indent, variable, membername, TrimKnownNamespace(typeref.ElementType.AsString)) & _
                           ControlChars.NewLine & _
                           VbMemberAssignment(indent, variable, membername & "(0)", typeref.ElementType)
                ElseIf typekind = vsCMTypeRef.vsCMTypeRefBool Then
                    value = "False"
                ElseIf typekind = vsCMTypeRef.vsCMTypeRefChar Then
                    value = """x""c"
                ElseIf typekind = vsCMTypeRef.vsCMTypeRefDecimal Then
                    value = "0.00d"
                ElseIf typekind = vsCMTypeRef.vsCMTypeRefDouble Then
                    value = "0.00r"
                ElseIf typekind = vsCMTypeRef.vsCMTypeRefInt Then
                    value = "0"
                ElseIf typekind = vsCMTypeRef.vsCMTypeRefLong Then
                    value = "0L"
                ElseIf typekind = vsCMTypeRef.vsCMTypeRefShort Then
                    value = "0s"
                ElseIf typekind = vsCMTypeRef.vsCMTypeRefByte Then
                    value = "0 AS Byte"
                ElseIf typekind = vsCMTypeRef.vsCMTypeRefString Then
                    value = """" & membername & """"
                ElseIf typekind = vsCMTypeRef.vsCMTypeRefArray Then
                    value = "New " & TrimKnownNamespace(typeref.ElementType.AsString) & "(1)"
                ElseIf typekind = vsCMTypeRef.vsCMTypeRefCodeType AndAlso _
                        typeref.AsString = "Date" Then
                    value = String.Format("new Date({0:yyyy}, {0:%M}, {0:%d})", DateTime.Today)
                Else
                    value = "new " & TrimKnownNamespace(typeref.AsString) & "()"
                End If
                Return String.Format("{0}{1}.{2} = {3}", indent, variable, membername, value)
            End Function
        
            Private Function VbMemberGetValue(ByVal indent As String, _
                                                ByVal variable As String, _
                                                ByVal membername As String, _
                                                ByVal typeref As EnvDTE.CodeTypeRef) As String
                Dim typekind As EnvDTE.vsCMTypeRef = typeref.TypeKind
                Dim value As String
                If typekind = vsCMTypeRef.vsCMTypeRefArray Then
                    value = "{0}Redim {1}.{2}(1)" ' Vb don't need type argument
                    Return String.Format(value, indent, variable, membername, TrimKnownNamespace(typeref.ElementType.AsString)) & _
                           ControlChars.NewLine & _
                           VbMemberGetValue(indent, variable, membername & "(0)", typeref.ElementType)
                ElseIf typekind = vsCMTypeRef.vsCMTypeRefBool Then
                    value = "src.GetBoolean()"
                ElseIf typekind = vsCMTypeRef.vsCMTypeRefChar Then
                    value = "src.GetChar()"
                ElseIf typekind = vsCMTypeRef.vsCMTypeRefDecimal Then
                    value = "src.GetDecimal()"
                ElseIf typekind = vsCMTypeRef.vsCMTypeRefDouble Then
                    value = "src.GetDouble()"
                ElseIf typekind = vsCMTypeRef.vsCMTypeRefInt Then
                    value = "src.GetInt32()"
                ElseIf typekind = vsCMTypeRef.vsCMTypeRefLong Then
                    value = "src.GetInt64()"
                ElseIf typekind = vsCMTypeRef.vsCMTypeRefShort Then
                    value = "src.GetInt16()"
                ElseIf typekind = vsCMTypeRef.vsCMTypeRefByte Then
                    value = "src.GetByte()"
                ElseIf typekind = vsCMTypeRef.vsCMTypeRefString Then
                    value = "src.GetString()"
                ElseIf typekind = vsCMTypeRef.vsCMTypeRefArray Then
                    value = "New " & TrimKnownNamespace(typeref.ElementType.AsString) & "(1)"
                ElseIf typekind = vsCMTypeRef.vsCMTypeRefCodeType AndAlso _
                        typeref.AsString = "Date" Then
                    value = "src.GetDateTime()"
                Else
                    value = "new " & TrimKnownNamespace(typeref.AsString) & "()"
                End If
                Return String.Format("{0}{1}.{2} = {3}", indent, variable, membername, value)
            End Function
        End Module
        

        【讨论】:

        • 如何执行宏?
        • 有人知道怎么用吗?
        【解决方案8】:

        早上好,您应该可以通过创建 Visual Studio Code Snippet 来做到这一点 或通过创建ReSharper Code Template

        【讨论】:

        • 是的,但是如何使用代码模板来做到这一点?有一个用于“执行智能完成”的 ReSharper 宏,但它只是弹出与this answer 相同的列表,这仍然需要您基本上输入每个。有没有宏可以枚举一个宏结果?
        • 您可能需要为此 make a custom macro,根据 another answer
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多