#c# #arrays #generics #extension-methods #ienumerable
#c# #массивы #обобщения #методы расширения #ienumerable
Вопрос:
В настоящее время я пытаюсь преобразовать IEnumerable<T>
в двумерный массив типа T2, используя метод расширения с универсальными типами. Вы также должны иметь возможность выбирать, какие свойства T вы хотите включить в этот массив.
Вот что у меня получилось на данный момент:
public static T2[][] ToMultidimensionalArray<T, T2>(this IEnumerable<T> enumerable, int count, params string[] propNames)
{
IEnumerator<T> enumerator = enumerable.GetEnumerator();
T2[][] resultArray = new T2[count][];
int i = 0;
int arrLength = propNames.Length;
while (enumerator.MoveNext())
{
resultArray[i] = new T2[arrLength];
int j = 0;
foreach(string prop in propNames)
{
resultArray[i][j] = ((T)enumerator.Current).//How do I access the properties?
j ;
}
i ;
}
return resultArray;
}
У меня возникла проблема с доступом к свойствам enumerator.Current
внутри foreach
-Loop.
Я использую .NET-Framework 4.0.
Любой ввод был бы высоко оценен.
Спасибо,
Деннис
Комментарии:
1. Это не сработает, поскольку T не знает никаких специальных свойств. На какой фреймворк вы ориентируетесь? Есть ли возможность использовать dynamics (из .NET 4.0)?
2. Вопрос обновлен. Я действительно использую 4.0.
Ответ №1:
В общем, эту проблему можно решить с помощью отражения:
public static T2[][] ToMultidimensionalArray<T, T2>(
this IEnumerable<T> enumerable,
int count,
params string[] propNames)
{
T2[][] resultArray = new T2[count][];
int i = 0;
int arrLength = propNames.Length;
foreach (var item in enumerable)
{
resultArray[i] = new T2[arrLength];
int j = 0;
foreach (string prop in propNames)
{
// Get the required property info using reflection
var propertyInfo = typeof(T).GetProperty(prop);
// Extract the getter method of the property
var getter = propertyInfo.GetGetMethod();
// Invoke the getter and get the property value
var value = getter.Invoke(item, null);
// Cast the value to T2 and store in the array
resultArray[i][j] = (T2) value;
j ;
}
i ;
}
return resultArray;
}
Я понял проблему как наличие T
коллекции s, где эти объекты имеют свойства T2
типа. Цель состоит в том, чтобы взять свойства каждого объекта и поместить их в многомерный массив. Поправьте меня, если я ошибаюсь.
Комментарии:
1. Нет необходимости вас поправлять, потому что вы не ошибаетесь, совсем наоборот! Спасибо за этот полезный ответ.
Ответ №2:
Вы имеете в виду (T2)typeof(T).getProperty(prop).Получаем значение (перечислитель.Текущий, null);
Но я не могу понять, чего вы хотите. Я не думаю, что этот метод может сработать.