PropertyInfo - GetDeclaraction

A PropertyInfo extension method that gets a declaraction.

Try it

public static void Main()
{
    PropertyInfo PublicProperty = typeof(PropertyModel<int>).GetProperty("PublicProperty", BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
	PropertyInfo ProtectedInternalProperty = typeof(PropertyModel<int>).GetProperty("ProtectedInternalProperty", BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
	PropertyInfo AbstractProperty = typeof(PropertyModel<int>).GetProperty("AbstractProperty", BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);

    //C# Extension Method: PropertyInfo - GetDeclaraction
    string PublicPropertyResult = PublicProperty.GetDeclaraction();
	string ProtectedInternalPropertyResult = ProtectedInternalProperty.GetDeclaraction();
	string AbstractPropertyResult = AbstractProperty.GetDeclaraction();
	
	Console.WriteLine(PublicPropertyResult);
	Console.WriteLine(ProtectedInternalPropertyResult);
	Console.WriteLine(AbstractPropertyResult);
}

public class PropertyModel<T> : AbstractPropertyModel
{
    public static int StaticProperty { get; set; }
    public override int OverrideProperty { get; set; }
    public virtual int VirtualProperty { get; set; }
    internal int InternalProperty { get; set; }
    private int PrivateProperty { get; set; }
    protected int ProtectedProperty { get; set; }
    protected internal int ProtectedInternalProperty { get; set; }
    public int PublicProperty { get; set; }
    public int PublicGetterPrivateSetterProperty { get; private set; }
    public int PrivateGetterPublicSetterProperty { private get; set; }
    public T GenericProperty { get; set; }
    public T this[T param1, int param2] { get { return param1; }}
    public override int AbstractProperty { get; set; }
}

public abstract class AbstractPropertyModel
{
    public abstract int AbstractProperty { get; set; }
    public virtual int OverrideProperty { get; set; }
}

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

public static partial class Extensions
{
    /// <summary>A PropertyInfo 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 PropertyInfo @this)
    {
        // Example: [Visibility] [Modifier] [Type] [Name | Indexer] { [VisibilityGetter] [Getter]; [VisibilitySetter] [Setter]; }
        var sb = new StringBuilder();

        // Variable
        bool canRead = @this.CanRead;
        bool canWrite = @this.CanWrite;
        int readLevel = 9;
        int writeLevel = 9;
        string readVisibility = "";
        string writeVisibility = "";

        // Variable Method
        bool isAbstract = false;
        bool isOverride = false;
        bool isStatic = false;
        bool isVirtual = false;

        // Set visibility
        if (canRead)
        {
            MethodInfo method = @this.GetGetMethod(true);
            isAbstract = method.IsAbstract;
            isOverride = method.GetBaseDefinition().DeclaringType != method.DeclaringType;
            isStatic = method.IsStatic;
            isVirtual = method.IsVirtual;

            if (method.IsPublic)
            {
                readLevel = 1;
                readVisibility = "public ";
            }
            else if (method.IsFamily)
            {
                readLevel = 2;
                readVisibility = "protected ";
            }
            else if (method.IsAssembly)
            {
                readLevel = 3;
                readVisibility = "internal ";
            }
            else if (method.IsPrivate)
            {
                readLevel = 5;
                readVisibility = "private ";
            }
            else
            {
                readLevel = 4;
                readVisibility = "protected internal ";
            }
        }
        if (canWrite)
        {
            MethodInfo method = @this.GetSetMethod(true);

            if (readLevel != 9)
            {
                isAbstract = method.IsAbstract;
                isOverride = method.GetBaseDefinition().DeclaringType != method.DeclaringType;
                isStatic = method.IsStatic;
                isVirtual = method.IsVirtual;
            }

            if (method.IsPublic)
            {
                writeLevel = 1;
                writeVisibility = "public ";
            }
            else if (method.IsFamily)
            {
                writeLevel = 2;
                writeVisibility = "protected ";
            }
            else if (method.IsAssembly)
            {
                writeLevel = 3;
                writeVisibility = "internal ";
            }
            else if (method.IsPrivate)
            {
                writeLevel = 5;
                writeVisibility = "private ";
            }
            else
            {
                writeLevel = 4;
                writeVisibility = "protected internal ";
            }
        }

        // Visibility
        if (canRead && canWrite)
        {
            sb.Append(readLevel <= writeLevel ? readVisibility : writeVisibility);
        }
        else if (canRead)
        {
            sb.Append(readVisibility);
        }
        else
        {
            sb.Append(writeVisibility);
        }

        // Modifier
        if (isAbstract)
        {
            sb.Append("abstract ");
        }
        else if (isOverride)
        {
            sb.Append("override ");
        }
        else if (isVirtual)
        {
            sb.Append("virtual ");
        }
        else if (isStatic)
        {
            sb.Append("static ");
        }

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

        // [Name | Indexer]
        ParameterInfo[] indexerParameter = @this.GetIndexParameters();
        if (indexerParameter.Length == 0)
        {
            // Name
            sb.Append(@this.Name);
        }
        else
        {
            // Indexer
            sb.Append("this");
            sb.Append("[");
            sb.Append(string.Join(", ", indexerParameter.Select(x => x.ParameterType.GetShortDeclaraction() + " " + x.Name)));
            sb.Append("]");
        }
        sb.Append(" ");

        sb.Append("{ ");
        // Getter
        if (@this.CanRead)
        {
            if (readLevel > writeLevel)
            {
                sb.Append(readVisibility);
            }
            sb.Append("get; ");
        }

        // Setter
        if (@this.CanWrite)
        {
            if (writeLevel > readLevel)
            {
                sb.Append(writeVisibility);
            }
            sb.Append("set; ");
        }
        sb.Append("}");

        return sb.ToString();
    }
}