Обратите внимание, этот вопрос немного неуловим, поэтому прочитайте его внимательно: я не просто пытаюсь выяснить, реализует ли какой-нибудь произвольный тип IEnumerable:
Вот функция, которую я написал с начальной реализацией:
// is "toType" some sort of sequence that would be satisfied
// by an array of type T? If so, what is the type of T?
// e.g.
// getArrayType(typeof(string[]) == typeof(string)
// getArrayType(typeof(IEnumerable<int>)) == typeof(int)
// getArrayType(typeof(List<string>)) == null // NOTE - Array<string> does not convert to List<string>
// etc.
private static Type getArrayType(Type toType)
{
if (toType.IsArray)
{
if (toType.GetArrayRank() != 1)
return null;
return toType.GetElementType();
}
// Look for IEnumerable<T>, and if so, return the type of T
if (toType.IsGenericType && toType.GetGenericTypeDefinition() == typeof(IEnumerable<>))
return toType.GetGenericArguments()[0];
return null;
}
Может ли быть лучше и обрабатывать больше дел? например В настоящее время
getType(typeof(ICollection<string>)) == null
но строка [] конвертируется в ICollection
Обратите внимание, я не знаю заранее, что такое тип "element".
Контекст таков: я пишу привязку отражения к языку сценариев и хочу, чтобы он «просто работал», если вы передаете объект [] какому-либо методу, ожидающему IEnumerable (он конвертирует каждый из элементов в этом случае входной массив в строку).
Итак, чтобы уточнить, скажем, у меня есть некоторая сигнатура метода:
void WriteCSV(ICollection<string> fields);
и мой интерпретатор сценариев имеет массив объектов, которые могут быть преобразованы в строку:
object[] fields = new object[] { "one", 2, "three" };
Тогда мой интерпретатор сценариев должен выяснить, что в данном случае действительно нужен массив строк.
Принимая во внимание, что мой переводчик сценариев должен отказаться, скажем:
void WriteCSV(IRecord record);
, хотя IRecord может даже реализовать некоторые IEnumerable:
interface IRecord : IEnumerable<string>
{
void OtherMethods();
}
Я никак не могу построить IRecord из массива чего-либо.
Так что просто выяснить, что IEnumerables реализует тип, не то, что мне нужно. Я сказал это было тонко, не так ли?