37

Is there any way that I can change how a Literal of a code snippet renders when it is used in the code that the snippet generates?

Specifically I'd like to know if I can have a literal called say, $PropertyName$ and then get the snippet engine to render "_$PropertyName$ where the first character is made lowercase.

I can't afford R#. Please help :)

1

3 Answers 3

24

Unfortunately there seems to be no way. Snippets offer amazingly limited support for transformation functions as you can see.

You have to stick with the VS standard solution, which is to write two literals: one for the property name, and the other for the member variable name.

Sign up to request clarification or add additional context in comments.

4 Comments

I'm afraid I've not. I ended up buying a personal license of R#
As of Visual Studio 2013, the three available functions are still only: GenerateSwitchCases, ClassName, and SimpleTypeName.
APPALLING!!! Is there a Visual Studio UserVoice entry for this? I'd give my votes for additional functions. I'm really perplexed how come they didn't even think of the other string-manipulating functions to add. Casing included.
8

You can enter a upper first letter, then a property name, then a lower first letter. Try this snippet:

<?xml version="1.0" encoding="utf-8"?>
<CodeSnippet Format="1.0.0" xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
  <Header>
    <Title>Notifiable Property</Title>
    <Author>Nikolay Makhonin</Author>
    <Shortcut>propn</Shortcut>
    <Description>Property With in Built Property Changed method implementation.</Description>
    <SnippetTypes>
      <SnippetType>SurroundsWith</SnippetType>
      <SnippetType>Expansion</SnippetType>
    </SnippetTypes>
  </Header>
  <Snippet>
    <Declarations>
        <Literal>
            <ID>Type</ID>
            <Default>Type</Default>
        </Literal>
        <Literal>
            <ID>P</ID>
            <Default>P</Default>
        </Literal>
        <Literal>
            <ID>roperty</ID>
            <Default>ropertyName</Default>
        </Literal>
        <Literal>
            <ID>p</ID>
            <Default>p</Default>
        </Literal>
        <Literal>
            <ID>Ownerclass</ID>
            <ToolTip>The owning class of this Property.</ToolTip>
            <Function>ClassName()</Function>
            <Default>Ownerclass</Default>
        </Literal>
    </Declarations>
    <Code Language="CSharp">
      <![CDATA[#region $P$$roperty$

        private Field<$Type$> _$p$$roperty$;
        public static readonly string $P$$roperty$PropertyName = GetPropertyName(() => (($Ownerclass$)null).$P$$roperty$);
        public $Type$ $P$$roperty$
        {
            get { return _$p$$roperty$; }
            set { Set(ref _$p$$roperty$, value); }
        }

        #endregion

]]>
    </Code>
  </Snippet>
</CodeSnippet>

Comments

6

a "fix" may be to use a prefix in the naming or the member variable, i.e.:

string m_$name$;
string $name$
{
 get{return m_$name$;}
 set{m_$name$=value;}
};

2 Comments

Yeah, but it doesn't allow you to change the casing of $name$ to make it camelCase. (Typically people use "_property" as the backing for a property named "Property", etc. Also "m_" is super deprecated... since like vb6...? please don't ever use it).
Sorry for necro-commenting, but "m_" is not deprecated at all. It's a great practice which I think should be used more. Unless you and anybody else never ever have to read that code again - yeah, because that never happened.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.