используя коллекцию в универсальной функции - PullRequest
1 голос
/ 16 апреля 2019

Я пытался использовать универсальную функцию для 2 видов коллекций, в которых я вызываю метод Add.

Итак, ниже моего кода:

using System;
using System.Collections;

namespace CollectionsApplication
{
    class Program
    {
        static void AddElement<T>(ref T container, string key, string value)
        {
            container.Add(key, value);
        }

        static void Main(string[] args)
        {
            SortedList s1 = new SortedList();
            Hashtable  h1 = new Hashtable();

            AddElement<SortedList>(ref s1, "001", "Zara Ali");
            AddElement<Hashtable>(ref h1, "001", "Zara Ali");
        }
    }
}

и ниже ошибки:

ошибка CS1061: «T» не содержит определения для «Add» и не имеет метода расширения «Add», принимающего первый аргумент типа «T»

ИтакМожно ли это сделать и как это исправить, если это возможно?

Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 16 апреля 2019

Проблема здесь в том, что T может быть чем угодно (например, int) и не обязательно иметь метод Add.

Вам нужно ограничить T чем-то, что имеет метод Add.

static void AddElement<T>(ref T container, string key, string value)
    where T : IDictionary 
{
    container.Add(key, value);
}
2 голосов
/ 16 апреля 2019

Или создайте метод расширения:

public static class MyExtensions
{
    public static void AddElement(this IDictionary container, string key, string value)
    {
        container.Add(key, value);
    }
}

И использование:

SortedList s1 = new SortedList();
Hashtable h1 = new Hashtable();

s1.AddElement("001", "Zara Ali");
h1.AddElement("001", "Zara Ali");
2 голосов
/ 16 апреля 2019

Почему бы не сделать это проще, вот так?

using System;
using System.Collections;

namespace CollectionsApplication
{
    class Program
    {
        static void AddElement(IDictionary container, string key, string value)
        {
            container.Add(key, value);
        }

        static void Main(string[] args)
        {
            SortedList s1 = new SortedList();
            Hashtable  h1 = new Hashtable();

            AddElement(s1, "001", "Zara Ali");
            AddElement(h1, "001", "Zara Ali");
        }
    }
}
...