var bf = BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly;
foreach (var item in coolList)
{
Type t = item.GetType();
if (t.IsPrimitive
|| (t.GetMethod("ToString", bf, null, Type.EmptyTypes, null) != null))
{
Console.WriteLine(item);
}
}
Это может быть медленно, так как он использует отражение, чтобы определить, переопределил ли конкретный тип метод ToString
.Более быстрой альтернативой может быть использование статического кэша для «запоминания» результата отражения, так что его нужно делать только один раз для каждого типа:
foreach (var item in coolList)
{
Type t = item.GetType();
if (t.IsPrimitive || _cache.GetOrAdd(t, _factory))
{
Console.WriteLine(item);
}
}
// ...
private static readonly ConcurrentDictionary<Type, bool> _cache =
new ConcurrentDictionary<Type, bool>();
private const BindingFlags _flags =
BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly;
private static readonly Func<Type, bool> _factory =
t => t.GetMethod("ToString", _flags, null, Type.EmptyTypes, null) != null;