Today I was working with some sample code, and I came across a misspelling. Not a big deal - there was a field that was named "m_postion" rather than "m_position".

But that got me thinking...

In the past, that sort of thing wouldn't have happened. You would have written:

int m_postion;

but then, when you wrote your code, you would have written:

m_position = 5;

and the compiler would have complained. But with intellisense, you now just pick whatever looks right in the popup list, and the mistakes stay around a bit longer.

So, I wrote a bit of code to help with this - it reflects over an assembly, and produces a list of words.

 

 

using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
using System.Reflection;

namespace IdentifierExtract
{
    class GetIdentifiers
    {
        Dictionary m_identifiers = new Dictionary();

        public GetIdentifiers()
        {
        }

        public void Process(string assemblyFilename)
        {
            Assembly assembly = Assembly.LoadFrom(assemblyFilename);

            foreach (Type type in assembly.GetTypes())
            {
                ProcessType(type);
            }
        }

        void ProcessType(Type type)
        {
            BreakIntoWordsAndAdd(type.Name);

            foreach (MemberInfo memberInfo in type.GetMembers(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static))
            {
                BreakIntoWordsAndAdd(memberInfo.Name);

                MethodBase methodBase = memberInfo as MethodBase;

                if (methodBase != null)
                {
                    foreach (ParameterInfo parameterInfo in methodBase.GetParameters())
                    {
                        BreakIntoWordsAndAdd(parameterInfo.Name);
                    }
                }
            }
        }

        void BreakIntoWordsAndAdd(string identifier)
        {
            List words = BreakPascalCasing(identifier);

            foreach (string word in words)
            {
                AddIdentifer(word);
            }
        }

        List BreakPascalCasing(string identifier)
        {
            Regex regex = new Regex(".[a-z]+");
            
            MatchCollection matches = regex.Matches(identifier);

            List words = new List();
            foreach (Match match in matches)
            {
                words.Add(match.Value);
            }

            return words;
        }

        private void AddIdentifer(string name)
        {
            name = name.ToLower();
            if (!m_identifiers.ContainsKey(name))
            {
                m_identifiers.Add(name, null);
            }
        }

        public void WriteToConsole()
        {
            List identifiers = new List(m_identifiers.Keys);
            identifiers.Sort();

            foreach (string identifier in identifiers)
            {
                Console.WriteLine(identifier);
            }
        }
    }
}