1 //----------------------------------------------------------------
2 // <copyright company="Microsoft Corporation">
3 // Copyright (c) Microsoft Corporation. All rights reserved.
5 //----------------------------------------------------------------
7 namespace Microsoft.Activities.Presentation
10 using System.Globalization;
12 using System.Text.RegularExpressions;
14 internal static class TypeNameHelper
16 // note: does not work for nested type when fullName is true
17 // eg. Namespace.DeclaringType.NestedType<T> will be displayed
18 // as Namespace.DeclaringType+NestedType<T>
19 public static string GetDisplayName(Type type, bool fullName)
26 if (type.IsGenericParameter)
31 if (!type.IsGenericType && !type.IsArray)
43 // replace `2 with <Type1, Type2>
44 Regex regex = new Regex("`[0-9]+");
45 GenericsMatchEvaluator evaluator = new GenericsMatchEvaluator(type.GetGenericArguments(), fullName);
47 // Remove [[fullName1, ..., fullNameX]]
58 int start = name.IndexOf("[[", StringComparison.Ordinal);
59 int end = name.LastIndexOf("]]", StringComparison.Ordinal);
60 if (start > 0 && end > 0)
62 name = name.Substring(0, start) + name.Substring(end + 2);
65 return regex.Replace(name, evaluator.Evaluate);
68 private class GenericsMatchEvaluator
70 private Type[] generics = null;
72 private bool fullName;
74 public GenericsMatchEvaluator(Type[] generics, bool fullName)
76 this.generics = generics;
78 this.fullName = fullName;
81 public string Evaluate(Match match)
83 int numberOfParameters = int.Parse(match.Value.Substring(1), CultureInfo.InvariantCulture);
85 StringBuilder sb = new StringBuilder();
87 // matched "`N" is replaced by "<Type1, ..., TypeN>"
90 for (int i = 0; i < numberOfParameters; i++)
97 sb.Append(TypeNameHelper.GetDisplayName(this.generics[this.index++], this.fullName));
102 return sb.ToString();