Попробуйте этот код
static bool IsSubclassOfRawGeneric(Type generic, Type toCheck) {
while (toCheck != null && toCheck != typeof(object)) {
var cur = toCheck.IsGenericType ? toCheck.GetGenericTypeDefinition() : toCheck;
if (generic == cur) {
return true;
}
toCheck = toCheck.BaseType;
}
return false;
}
List<T>
не происходит от Collection<T>
- это действительно, однако, реализует ICollection<T>
. Это было бы лучшим выбором типа возврата.
Что касается new List<int>(some collection<int>)
вопрос - это частично зависит от того, каков набор. Если это реализует ICollection<T>
(во время выполнения) затем, конструктор может использовать Count
свойство для создания списка с правильной начальной способностью прежде, чем выполнить итерации через него и добавить каждый объект. Если это не реализует ICollection<T>
затем, это просто эквивалентно:
List<int> list = new List<int>();
foreach (int x in otherCollection)
{
list.Add(x);
}
Все еще хороший иметь в удобном конструкторе, но не чрезвычайно эффективное - это не может быть, действительно.
я не полагаю, что конструктор делает что-либо хитрость для массивов, которые она потенциально могла - использование Array.Copy
или безотносительно просто скопировать партию сразу вместо итерации все же. (Аналогично, если бы это был другой List<T>
, то это могло бы достигнуть вспомогательный массив и копию настолько непосредственно.)
List<T>
не наследовался от Collection<T>
. Простой и простой. Если List<T>
не обеспечивает оператор для неявного преобразования в Collection<T>
, Вы не можете сделать этого. Я на самом деле предложил бы возвратиться List<T>
, если Вы можете, поскольку я полагаю, что правила проходят примерно так:
Принимают в качестве параметра наименьшее количество возможного интерфейса constrictive. Возвратитесь как возвращаемый параметр большая часть возможного типа constrictive.
Here is a generic extension method written in C# 3.0 used to convert List
to Collection
using System.Collections.Generic;
using System.Collections.ObjectModel;
public static class ExtensionMethods
{
public static Collection<T> ToCollection<T>(this List<T> items)
{
Collection<T> collection = new Collection<T>();
for (int i = 0; i < items.Count; i++)
{
collection.Add(items[i]);
}
return collection;
}
}
and it is used like this…
List<string> entities = new List<string>();
entities.Add("Value 1");
entities.Add("Value 2");
entities.Add("Value 3");
entities.Add("Value 4");
Collection<string> convertedEntities = entities.ToCollection<string>();
Почему бы просто не сделать следующее:
Collection<string> collection = new Collection<string>(theList);
as Collection (вход IList) принимает список как часть конструкции.