我创建了一个名为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]
。你能指点我的错误吗?
答案 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());