如何显示自定义类的类型?

时间:2013-07-04 08:09:05

标签: c# generic-list

我创建了一个名为MyGenList<T>的自定义通用列表类。我已经覆盖了ToString()方法,因此如果列表为空,则只显示对象的类型。

public override string ToString()
    {
        if (this.count == 0)
        {
            return this.GetType().ToString();
        }
        else
        {
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < this.count; i++)
            {
                sb.Append(elements[i]);
                sb.Append(System.Environment.NewLine);
            }
            return sb.ToString();
        }
    }

如果我有一个空的字符列表,我希望显示GenericClasses.MyGenList<char>。但是,目前控制台显示GenericClasses.MyGenList1[System.Char]。你能指点我的错误吗?

4 个答案:

答案 0 :(得分:2)

试试这个:

public override string ToString()
{
    if (this.count == 0)
    {
        Type t = this.GetType();

        if (t.IsGenericType)
        {
            Type g = t.GetGenericTypeDefinition();

            return g.Name.Remove(g.Name.IndexOf('`')) + "<" + typeof(T).Name + ">";
        }

        return t.ToString();
    }
    else
    {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < this.count; i++)
        {
            sb.Append(elements[i]);
            sb.Append(System.Environment.NewLine);
        }
        return sb.ToString();
    }
}

答案 1 :(得分:1)

GenericClasses.MyGenList<char>是您在代码中看到的方式,GenericClasses.MyGenList1[System.Char]但是内部表示。

您可以在类上重载ToString()方法,以便按照您想要的方式显示它。

答案 2 :(得分:1)

要做到这一点,你需要替换特殊的`字符,并将类型名称缩短为它们的C#等价物。

以下代码是从另一个答案复制而来的:Get user-friendly name for generic type in C#

public static string GetFriendlyName(this Type type)
{
    if (type == typeof(int))
        return "int";
    else if (type == typeof(short))
        return "short";
    else if (type == typeof(byte))
        return "byte";
    else if (type == typeof(bool))
        return "bool";
    else if (type == typeof(long))
        return "long";
    else if (type == typeof(float))
        return "float";
    else if (type == typeof(double))
        return "double";
    else if (type == typeof(decimal))
        return "decimal";
    else if (type == typeof(string))
        return "string";
    else if (type.IsGenericType)
        return type.Name.Split('`')[0] + "<" + string.Join(", ", type.GetGenericArguments().Select(x => GetFriendlyName(x))) + ">";
    else
        return type.Name;
}

这是一个扩展方法,因此必须放入静态类,可能称为TypeExt

你这样称呼它(基于你的代码):

return this.GetType().GetFriendlyName();

答案 3 :(得分:0)

试试这个:

public override string ToString()
{
    if (this.count == 0)
    {
        var type = this.GetType().ToString();
        var matches = Regex.Matches(type,
                @"([a-zA-Z0-9`]*\.{1}[a-zA-Z0-9`]*)*")
                .Cast<Match>();
        foreach (Match match in matches.Where(m => m.Value != ""))
        {
            var currentType = Type.GetType(match.Value) 
                ?? Type.GetType(match.Value + "<>");
            type = type.Replace(match.Value, currentType.Name);
        }
        type = type.Replace("`", "");
        return type;
    }
    else
    {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < this.Count; i++)
        {
            sb.Append(this[i]);
            sb.Append(System.Environment.NewLine);
        }
        return sb.ToString();
    }
}

测试它:

var list = new MyGenList<Dictionary<string,Dictionary<int, List<DateTime>>>>();
Console.WriteLine(list.ToString());