Skip to content

An MSBuild task that generates a strongly typed helper class for resource files with support for string formatting.

License

Notifications You must be signed in to change notification settings

khellang/ResourceHelperGenerator

Repository files navigation

ResourceHelperGenerator

An MSBuild task that generates a strongly typed helper class for resource files with support for string formatting.

The task will automatically hook into the MSBuild pipeline when you install the NuGet package, either using Install-Package ResourceHelperGenerator or through the Package Manager UI.

It will generate strongly typed helpers for *.resx files under the Properties folder of your project. This will hopefully be customizable at some point in the future.

String resources containing either {0}-type placeholders or {argumentName}-type placeholders, will get methods accepting corresponding arguments, while resources without placeholders will get properties generated.

Example

If you have the following resource file, called Strings.resx sitting under the Properties folder of your project, which has a default namespace of MyCompany.AwesomeApp:

Name Value
ArgumentNull The argument '{argumentName}' cannot be null.
StringArgumentEmpty The string argument '{argumentName}' cannot be empty.

The following file, Strings.Designer.cs will be generated and placed under the Strings.resx file in your project:

// <auto-generated />

#if NETFX_CORE
#define RESOURCE_HELPER_TYPEINFO
#endif

namespace MyCompany.AwesomeApp
{
    using System;
    using System.CodeDom.Compiler;
    using System.Diagnostics;
    using System.Globalization;
    using System.Reflection;
    using System.Resources;

    [GeneratedCode("ResourceHelperGenerator", "0.3.1")]
#if RESOURCE_HELPER_INTERNAL
    internal
#else
    public
#endif
    static class Strings
    {
        private static readonly ResourceManager ResourceManager
            = new ResourceManager("MyCompany.AwesomeApp.Properties.Strings", GetAssembly(typeof(Strings)));

        /// <summary>
        /// The argument '{argumentName}' cannot be null.
        /// </summary>
        public static string ArgumentNull(object argumentName)
        {
            return string.Format(CultureInfo.CurrentCulture, GetString("ArgumentNull", "argumentName"), argumentName);
        }

        /// <summary>
        /// The string argument '{argumentName}' cannot be empty.
        /// </summary>
        public static string StringArgumentEmpty(object argumentName)
        {
            return string.Format(CultureInfo.CurrentCulture, GetString("StringArgumentEmpty", "argumentName"), argumentName);
        }

        private static string GetString(string name, params string[] formatterNames)
        {
            var value = ResourceManager.GetString(name);

            if (value == null)
            {
                throw new Exception(string.Format("Value for key '{0}' was null.", name));
            }

            if (formatterNames != null)
            {
                for (var i = 0; i < formatterNames.Length; i++)
                {
                    value = value.Replace("{" + formatterNames[i] + "}", "{" + i + "}");
                }
            }

            return value;
        }

        private static Assembly GetAssembly(Type type)
        {
#if RESOURCE_HELPER_TYPEINFO
            return type.GetTypeInfo().Assembly;
#else
            return type.Assembly;
#endif
        }
    }
}

The first time this happens, the task will modify your project file (to add the helper) and you will be asked to reload the project.

Internalized Helper Class

If you want to internalize the helper class, you must add the RESOURCE_HELPER_INTERNAL conditional compilation symbol in the project's build configuration.

About

An MSBuild task that generates a strongly typed helper class for resource files with support for string formatting.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Languages