C# Get Generic Type Name

前端 未结 9 1749
旧时难觅i
旧时难觅i 2020-11-30 06:09

I need some way to get the Name of a Type, when type.IsGenericType = true.

    Type t = typeof(List);
    MessageBox.         


        
9条回答
  •  一个人的身影
    2020-11-30 07:11

    I know this is an old question, but a colleague and myself needed to do this for some intellisense/roslyn work. The optimal solution appeared to be Ali's solution, but it doesn't work for nested types:

        int i = 1; //would work
        List listTest = new List(); //would work
        Dictionary dictTest = new Dictionary(); //would work
        Dictionary> nestTest = new Dictionary>(); //would fail
        Dictionary>>> superNestTest = new Dictionary>>>(); //would fail
        Dictionary>> superNestTest2 = new Dictionary>>(); //would fail
    

    In order to solve these issues, I converted the function into a recursive method:

    public static class TypeExtensions
    {
        public static string GetFriendlyName(this Type type)
        {
            string friendlyName = type.FullName;
            if (type.IsGenericType)
            {
                friendlyName = GetTypeString(type);
            }
            return friendlyName;
        }
    
        private static string GetTypeString(Type type)
        {
            var t = type.AssemblyQualifiedName;
    
            var output = new StringBuilder();
            List typeStrings = new List();  
    
            int iAssyBackTick = t.IndexOf('`') + 1;
            output.Append(t.Substring(0, iAssyBackTick - 1).Replace("[", string.Empty));
            var genericTypes = type.GetGenericArguments();
    
            foreach (var genType in genericTypes)
            {
                typeStrings.Add(genType.IsGenericType ? GetTypeString(genType) : genType.ToString());
            }
    
            output.Append($"<{string.Join(",", typeStrings)}>");
            return output.ToString();
        }
    }
    

    running for the previous examples/test cases yielded the following outputs:

    System.Int32
    System.Collections.Generic.List
    System.Collections.Generic.Dictionary
    System.Collections.Generic.Dictionary>
    System.Collections.Generic.Dictionary>>>
    System.Collections.Generic.Dictionary>>
    

    I spent some time trying to resolve the nested types issue so wanted to document this here to ensure anyone else in future can save some considerable time (and headaches!). I have checked the performance as well, and it is in the microseconds to complete (8 microseconds in the case of the last scenario:

    Performance results
    (Variables names used from original scenario list)
    "i" | 43uS
    "listTest" | 3uS
    "dictTest" | 2uS
    "nestTest" | 5uS
    "superNestTest" | 9uS
    "superNestTest2" | 9uS
    Average times after performing the above code 200 times on each scenario

提交回复
热议问题