public static String GetCSharpDecl(this MethodBase m, ToCSharpOptions opt)
        {
            opt = opt ?? ToCSharpOptions.Terse;
            var buffer = new StringBuilder();

            if (opt.EmitAttributes && m.Attrs().IsNotEmpty())
            {
                buffer.Append(m.GetCSharpAttributesClause(opt)).Append(" ");
            }
            if (opt.EmitAttributes && m is MethodInfo && (((MethodInfo)m).ReturnParameter).Attrs().IsNotEmpty())
            {
                buffer.Append(((MethodInfo)m).ReturnParameter.GetCSharpAttributesClause(opt)).Append(" ");
            }
            if (opt.EmitVisibilityQualifier)
            {
                buffer.Append(m.GetCSharpVisibilityQualifier()).Append(" ");
            }
            if (opt.EmitStaticQualifier && m.IsStatic)
            {
                buffer.Append("static ");
            }
            if (!(m is ConstructorInfo))
            {
                buffer.Append(m.Ret().GetCSharpRef(opt)).Append(" ");
            }
            if (opt.EmitDeclaringType)
            {
                buffer.Append(m.DeclaringType.GetCSharpRef(ToCSharpOptions.Terse) + "::");
            }
            if (!(m is ConstructorInfo))
            {
                buffer.Append(m.Name.Slice(0, m.Name.IndexOf("`") == -1 ? m.Name.Length : m.Name.IndexOf("`")));
            }
            else if (opt.EmitCtorNameAsClassName)
            {
                buffer.Append(m.DeclaringType.Name.Slice(0, m.DeclaringType.Name.IndexOf("`") == -1 ? m.DeclaringType.Name.Length : m.DeclaringType.Name.IndexOf("`")));
            }
            else
            {
                buffer.Append(m.Name.Slice(0, m.Name.IndexOf("`") == -1 ? m.Name.Length : m.Name.IndexOf("`")));
            }
            if (opt.EmitTypeArgs)
            {
                buffer.Append(m.GetCSharpTypeArgsClause(opt));
            }

            buffer.Append("(");
            m.GetParameters().ForEach((pi, i) =>
            {
                if (opt.EmitAttributes && pi.Attrs().IsNotEmpty())
                {
                    buffer.Append(pi.GetCSharpAttributesClause(opt)).Append(" ");
                }

                var mod = "";
                if (pi.ParameterType.IsByRef && pi.IsOut)
                {
                    mod = "out";
                }
                if (pi.ParameterType.IsByRef && !pi.IsOut)
                {
                    mod = "ref";
                }
                if (mod.IsNotEmpty())
                {
                    buffer.Append(mod).Append(" ");
                }

                var t_par = pi.ParameterType.IsByRef ? pi.ParameterType.GetElementType() : pi.ParameterType;
                buffer.Append(t_par.GetCSharpRef(opt)).Append(" ");
                buffer.Append(pi.Name);

                if (i != m.GetParameters().Count() - 1)
                {
                    buffer.Append(", ");
                }
            });
            buffer.Append(")");

            if (opt.EmitTypeArgsConstraints)
            {
                buffer.Append(m.GetCSharpTypeConstraintsClause(opt));
            }

            if (opt.EmitSemicolon)
            {
                buffer.Append(";");
            }
            return(buffer.ToString());
        }