Если вы не знаете тип в времени компиляции, но вы хотите, фактический типа (т.е. не List<object>
) и вы не в родовой методе/типа с соответствующим параметром типа, то вы должны использовать отражение.
чтобы сделать отражение проще , Я иногда вводил новый родовой тип или метод в свой собственный код, поэтому я могу назвать это отражением, но n после этого используйте обычные дженерики. Например:
object x = GetObjectFromSomewhere();
// I want to create a List<?> containing the existing
// object, but strongly typed to the "right" type depending
// on the type of the value of x
MethodInfo method = GetType().GetMethod("BuildListHelper");
method = method.MakeGenericMethod(new Type[] { x.GetType() });
object list = method.Invoke(this, new object[] { x });
// Later
public IList<T> BuildListHelper<T>(T item)
{
List<T> list = new List<T>();
list.Add(item);
return list;
}
Конечно, вы не можете сделать очень много с перечнем потом, если вы не знаете тип ... вот почему такого рода вещи часто падает. Не всегда, хотя - я использовал что-то вроде выше в нескольких случаях, когда система типов просто не позволяет мне выразить все, что мне нужно, статически.
EDIT: Обратите внимание, что хотя я вызываю Type.GetMethod в приведенном выше коде, если вы собираетесь выполнить его много, вы, вероятно, захотите просто называть его один раз - в конце концов, метод не собирается изменить. Вы можете сделать его статическим (вы могли бы в случае выше), и вы, вероятно, захотите сделать его приватным. Я оставил его как метод публичного экземпляра для простоты вызова GetMethod в примере кода - вам нужно указать соответствующие флаги привязки в противном случае.
Вы можете вернуть не-общий IList (который поддерживается List <>), тогда возвращаемый список будет полезен. – configurator 2008-11-28 18:42:25