Метод расширений с универсальным возвратом не распознается и вызывает ошибку CS1061 - PullRequest
1 голос
/ 22 февраля 2012

Я пытался реализовать метод расширения для преобразования объекта ArrayList в список.Я сослался на this .

namespace MyProjects.Extensions
{
    static class ArrayListExtensions
    {
        /// <summary>
        /// ArrayList => List<T>
        /// </summary>
        /// <remarks>
        /// Based on http://www.dotnetperls.com/convert-arraylist-list
        /// </remarks>
        public static List<T> ToListCollection<T>(this ArrayList arrayList)
        {
            List<T> list = new List<T>(arrayList.Count);
            foreach (T instance in arrayList)
            {
                list.Add(instance);
            }
            return list;
        }
    }
}

Когда я пытался его использовать, я убедился, что добавил предложение using MyProjects.Extensions, но оно все еще не распознано.Есть идеи?

ArrayList arrTest = Settings.Default["ListA"] as ArrayList;
arrTest.ToListCollection<MyCustomObject>();

1 Ответ

5 голосов
/ 22 февраля 2012

Сделайте свой добавочный класс public и попробуйте. Если он находится в другом пространстве имен, он не доступен для вашего текущего проекта. По умолчанию при отсутствии модификатора доступа указанным классом являются internal.

Сделай что-нибудь подобное

namespace MyProjects.Extensions
{
    public static class ArrayListExtensions
    {
        /// <summary>
        /// ArrayList => List<T>
        /// </summary>
        /// <remarks>
        /// Based on http://www.dotnetperls.com/convert-arraylist-list
        /// </remarks>
        public static List<T> ToListCollection<T>(this ArrayList arrayList)
        {
            List<T> list = new List<T>(arrayList.Count);
            foreach (T instance in arrayList)
            {
                list.Add(instance);
            }
            return list;
        }
    }
}

Подробнее о Модификаторы доступа на MSDN .

Примечание : На указанном сайте есть демонстрационная версия, в которой класс расширения определен в том же пространстве имен, что и потребитель.

В качестве альтернативы вы можете использовать arrayList.Cast<T>().ToList() (из Jon Skeet ' s comment).

Надеюсь, это поможет вам.

...