我正在为字典制作一个ToDebugString()方法,但我还希望它可以使用该类型的任何项如果该类型有可用的ToDebugString()方法的话。
由于ToDebugString()有时作为本机.NET类型的扩展方法实现(如字典和列表),因此我在检查方法是否存在时遇到了麻烦。我只将扩展方法放在一个称为ExtensionMethods的单个类中,这样我就只需要搜索一个附加类。
关注点如下:
ToDebugString()抱怨类型参数。另外,由于Value是泛型类型,它不会自动建议ToDebugString()方法,因此我假设那里也存在问题。
如果我不使用本地的.NET类型,实现一个通用接口可能是解决方案。
以下是完整代码片段:
此外,这里有一些我为了尝试让
由于ToDebugString()有时作为本机.NET类型的扩展方法实现(如字典和列表),因此我在检查方法是否存在时遇到了麻烦。我只将扩展方法放在一个称为ExtensionMethods的单个类中,这样我就只需要搜索一个附加类。
关注点如下:
ToDebugString()抱怨类型参数。另外,由于Value是泛型类型,它不会自动建议ToDebugString()方法,因此我假设那里也存在问题。
kv.Value.HasMethod("ToDebugString") ? kv.Value.ToDebugString() : kv.Value.ToString()
如果我不使用本地的.NET类型,实现一个通用接口可能是解决方案。
以下是完整代码片段:
// via: https://dev59.com/a2435IYBdhLWcg3w9FHi#5114514
public static bool HasMethod(this object objectToCheck, string methodName) {
var type = objectToCheck.GetType();
return type.GetMethod(methodName) != null;
}
// Convert Dictionary to string
// via: https://dev59.com/dm025IYBdhLWcg3wnnYw#5899291
public static string ToDebugString<TKey, TValue>(this IDictionary<TKey, TValue> dictionary)
{
return "{" + string.Join(", ", dictionary.Select(kv => kv.Key.ToString() + "=" + (kv.Value.HasMethod("ToDebugString") ? kv.Value.ToDebugString() : kv.Value.ToString())).ToArray()) + "}";
}
此外,这里有一些我为了尝试让
HasMethod()
给出正确结果而做的小测试:链接。
typeof(ExtensionMethods).HasMethod()
目前正在在类型Type
上查找该方法,因为您将其作为对象传递并在其上调用GetType()
,这将返回typeof(Type)
。 - Dan Bryanttypeof(ExtensionMethods).GetType() == typeof(Type)
,所以如果你说typeof(ExtensionMethods).GetType().GetMethod()
,你是在查找类型 Type 上的方法。你需要更改你的辅助函数HasMethod
,允许直接检查类型而不是实例的类型。 - Dan Bryant