Метод расширения универсального типа в Multidimensionalarray

#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);

Но я не могу понять, чего вы хотите. Я не думаю, что этот метод может сработать.