0

我创建了一个名为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

4 回答 4

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();
    }
}
于 2013-07-04T08:16:03.533 回答
1

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

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

于 2013-07-04T08:13:15.840 回答
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();
于 2013-07-04T08:21:46.700 回答
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());
于 2013-07-04T08:46:43.090 回答