【发布时间】:2014-07-10 10:41:45
【问题描述】:
我正在为字典创建一个ToDebugString() 方法,但我也希望它对任何适用于该类型的项目使用ToDebugString() 方法。
由于 ToDebugString() 有时被实现为原生 .NET 类型(如字典和列表)的扩展方法,因此我无法检查该方法是否存在。我只是将扩展方法放在一个名为 ExtensionMethods 的类中,所以我可能只需要在一个额外的类中进行搜索。
兴趣点在这里:
ToDebugString() 抱怨类型参数。此外,由于Value 是泛型类型,它不会自动建议ToDebugString() 方法,所以我认为那里也存在问题。
kv.Value.HasMethod("ToDebugString") ? kv.Value.ToDebugString() : kv.Value.ToString()
如果我不使用本机 .NET 类型,我认为实现一个通用接口将是解决方案。
这是完整的sn-p:
// via: http://stackoverflow.com/a/5114514/796832
public static bool HasMethod(this object objectToCheck, string methodName) {
var type = objectToCheck.GetType();
return type.GetMethod(methodName) != null;
}
// Convert Dictionary to string
// via: http://stackoverflow.com/a/5899291/796832
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()) + "}";
}
还有here are a small tests 我试图让HasMethod() 给出正确的答案。
【问题讨论】:
-
typeof(ExtensionMethods).HasMethod()目前正在寻找Type类型上的方法,因为您将其作为对象传入并在其上调用GetType(),这将返回typeof(Type)。 -
@DanBryant 我试图关注this answer,它做同样的事情。
-
是的,但是
typeof(ExtensionMethods).GetType() == typeof(Type),所以如果你说typeof(ExtensionMethods).GetType().GetMethod(),你正在寻找一个Type 类型的方法。您需要更改您的助手HasMethod以允许直接检查类型而不是实例的类型。 -
@MLM,看看这个答案 - stackoverflow.com/questions/299515/…。扩展方法不属于它们扩展的类型。它们属于定义它们的类。
-
@aleksey.berezan 感谢您提醒我这个问题。我现在有一个有效的方法
HasMethodOrExtensionMethod,但这解决了一半的问题。如果该方法不存在,它将无法编译,因为我试图调用一个不存在的方法。请参阅问题的更新部分。
标签: c# generics extension-methods