TL; DL: упрощение method<returnType, ListType>(this List<ListType>, ...)
до method<returnType>(this List<anyType>, ...)
для общих списков
Я хочу написать метод расширения, который позволит мне получить значения всех свойств "P" в Списке (любого типа объекта)
Пока я получил этот метод для работы:
public static T[] selectAll<T, U>(this List<U> list, string property)
{
List<T> r = new List<T>(); // prepare a list of values of the desired type to be returned
foreach(object o in list)
{
Type mt = o.GetType(); // what are we actually dealing with here? (List of what?) <-- This should be the same as Type U
IList<PropertyInfo> props = new List<PropertyInfo>(mt.GetProperties()); // Get all properties within that type
foreach(PropertyInfo p in props)
{
if (p.Name == property) // Are we looking for this property?
r.Add((T)p.GetValue(o, null)); // then add it to the list to be returned
}
}
return r.ToArray();
}
Поскольку вы не можете просто иметь неизвестный тип возвращаемого значения, я понимаю, что необходимо указать тип возвращаемого значения в вызове метода, например:
List<Control> SomeListOfControls =
...
string[] s = SomeListOfControls.selectAll<
строка , Control>("Text");
Но, поскольку тип элементов в этом списке довольно не имеет значения для этого метода, я хочу исключить переменную типа из уравнения.
Я хотел бы просто позвонить
List<Control> SomeListOfControls =
...
string[] s = SomeListOfControls.selectAll<string>("Text");
<- Вы чертовски хорошо знаете, из чего состоит этот Список>. <</p>
например.
Но я не могу придумать, как это сделать.
Еще до компиляции я вижу, что
public static T[] selectAll<T>(this List<> list, string property)
- это Unexpected use of an unbound generic name
(что означает List<>
).
И List<object>
не регистрируется как расширение для всех видов List<?extends object>
, так сказать.
Как, если это вообще возможно, я могу заставить это работать?
PS: Кажется, что может существовать "нативный" способ (.net или даже C # в целом) для получения коллекции P из коллекции, которая может иметь свойства типа P T - Я не мог понять это, используя select
и все ... Но если есть: я был бы рад узнать об этом:)