gpt4 book ai didi

c# - 无法在通用 tostring 方法 C# 中推断类型

转载 作者:太空宇宙 更新时间:2023-11-03 23:42:47 28 4
gpt4 key购买 nike

我有一个自定义的辅助方法,它接受一个值,并确定它的类型。如果它是一个可以被枚举的数据结构,那么它会被传递给相应的 ToString 方法以被打印出来。但如果没有,则调用内置的 .ToString() 方法。

public static String GetString<T> (T value)
{
Type t = typeof(T);
if (t.IsSubclassOf (typeof(IDictionary)))
return _GetString_Dictionary(value);
else if (t.IsSubclassOf (typeof(IEnumerable)))
return _GetString_Enumerable (value);
else
return value.ToString ();
}

但是,我遇到了很多错误,这些错误与无法为每次调用其他方法推断出参数类型有关。对于如何解决这个问题,我目前没有主动权;甚至可以实现吗?

下面是上面调用的其他toString方法,供引用;

private static String _GetString_Dictionary<KT, VT> (Dictionary<KT, VT> d)
{
string s = "{";
foreach (var pair in d)
s += GetString(pair.Key) + " : " + GetString(pair.Value) + ", ";
return s.Substring (0, s.Length - 2) + "}";
}

private static String _GetString_Enumerable<T> (IEnumerable<T> e)
{
string s = "[";
foreach (T i in e)
s += GetString(i) + ", ";
return s.Substring(0, s.Length-2) + "]";
}

编辑:根据 Equiso 的信息缩短代码。


按照 David Manning 的示例,我已将代码修改为这样;

public static String GetString<KT, VT> (Dictionary<KT, VT> d)
{
string s = "{";
foreach (var pair in d)
s += GetString(pair.Key) + " : " + GetString(pair.Value) + ", ";
return s.Substring (0, s.Length - 2) + "}";
}

public static String GetString<T> (IEnumerable<T> e)
{
string s = "[";
foreach (T i in e)
s += GetString(i) + ", ";
return s.Substring(0, s.Length-2) + "]";
}

public static String GetString<T> (T value)
{
return value.ToString ();
}

它不再抛出错误。

编辑:它没有按预期工作;它会在传递给它的每个对象上调用 .ToString() 的通用 .ToString() 版本,而不是更具体的重载(如果适用的话)。将 List 对象传递给它会返回字符串 System.Collections.Generic.List'1[System.String]。而不是列表的内容。

最佳答案

您不需要在这里使用泛型,您可以使用非泛型集合接口(interface)定义 GetString,编译器会将您的调用绑定(bind)到最具体的一个。例如:

public static String GetString(object value) {

if (value is string) {
return value as string;
} else if (value is IDictionary) {
return GetString(value as IDictionary);
} else if (value is IEnumerable) {
return GetString(value as IEnumerable);
} else {
return value.ToString();
}

}

public static String GetString(string l) {
return l;
}

public static String GetString(IEnumerable l) {
string s = "[";
foreach (object i in l) {
s += GetString(i) + ", ";
}
if (s != "[") s = s.Substring(0, s.Length - 2);
return s + "]";
}

public static String GetString(IDictionary d) {
string s = "{";
foreach (object key in d.Keys) {
s += GetString(key) + " : " + GetString(d[key]) + ", ";
}
if (s != "{") s = s.Substring(0, s.Length - 2);
return s + "}";
}

Array、List 和 IEnumerable 情况都将包含在 IEnumerable 重载中。注意:需要重载字符串,因为我们不想将其视为 IEnumberable。

关于c# - 无法在通用 tostring 方法 C# 中推断类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28468560/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com