FieldInfo - GetDeclaraction

A FieldInfo extension method that gets a declaraction.

Try it

public static void Main()
{
    FieldInfo constField = typeof(FieldModel<int>).GetField("ConstField", BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
	FieldInfo eventField = typeof(FieldModel<int>).GetField("EventField", BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
	FieldInfo internalField = typeof(FieldModel<int>).GetField("InternalField", BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);

    //C# Extension Method: FieldInfo - GetDeclaraction
    string constFieldResult = constField.GetDeclaraction();
	string eventFieldResult = eventField.GetDeclaraction();
	string internalFieldResult = internalField.GetDeclaraction();
	
	Console.WriteLine(constFieldResult);
	Console.WriteLine(eventFieldResult);
	Console.WriteLine(internalFieldResult);
}

public class FieldModel<T>
{
	public const int ConstField = 1;
    public static int StaticField;
    public readonly int ReadOnlyField = 1;
    public volatile int VolatileField = 1;
    public event EventHandler EventField;
    internal int InternalField;
    protected internal int ProtectedInternalField;
    private int PrivateField;
    protected int ProtectedField;
    public int PublicField;
    public T GenericField;
}

View Source
using System;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Text;

public static partial class Extensions
{
    /// <summary>A FieldInfo extension method that gets a declaraction.</summary>
    /// <param name="this">The @this to act on.</param>
    /// <returns>The declaraction.</returns>
    public static string GetDeclaraction(this FieldInfo @this)
    {
        // Example: [Visibility] [Modifier] [Type] [Name] [PostModifier];
        var sb = new StringBuilder();

        // Variable
        bool isConstant = false;
        Type[] requiredTypes = @this.GetRequiredCustomModifiers();

        // Visibility
        if (@this.IsPublic)
        {
            sb.Append("public ");
        }
        else if (@this.IsPrivate)
        {
            sb.Append("private ");
        }
        else if (@this.IsFamily)
        {
            sb.Append("protected ");
        }
        else if (@this.IsAssembly)
        {
            sb.Append("internal ");
        }
        else
        {
            sb.Append("protected internal ");
        }

        // Modifier
        if (@this.IsStatic)
        {
            if (@this.IsLiteral)
            {
                isConstant = true;
                sb.Append("const ");
            }
            else
            {
                sb.Append("static ");
            }
        }
        else if (@this.IsInitOnly)
        {
            sb.Append("readonly ");
        }
        if (requiredTypes.Any(x => x == typeof (IsVolatile)))
        {
            sb.Append("volatile ");
        }

        // Type
        sb.Append(@this.FieldType.GetShortDeclaraction());
        sb.Append(" ");

        // Name
        sb.Append(@this.Name);

        // PostModifier
        if (isConstant)
        {
            sb.Append(" = " + @this.GetRawConstantValue());
        }

        // End
        sb.Append(";");

        return sb.ToString();
    }
}