Я пытаюсь сделать что-то, что будет работать на C++, но C# для меня немного сложнее.C# Параметры шаблона
У меня есть метод, который выполняет немного разбора, доступа к базе данных, веб-доступа/etc и в конечном итоге заканчивается цепочкой строк для добавления в контейнер. Иногда мне нужно, чтобы добавить его в HashSet или списка или т.п.
Так, в C++, это будет выглядеть следующим образом:
<template T>
bool GetStrings(T& container)
{
...
std::string foo = "bar";
...
container.add(foo); // This statement is within a loop and if checks
...
return true;
}
Я попробовал, что в C#:
private bool GetStrings<T>(ref T cont)
{
string foo = "BAR";
cont.Add(foo); // T does not contain a definition for Add ...
return true;
}
A коллега предложил вместо этого использовать базовый класс/интерфейс контейнера. Итак, я попытался это (после просмотра списка, HashSet и т.д. имеют общее определение интерфейса):
private bool GetStrings(ref ICollection<string> cont)
{
string foo = "BAR";
cont.Add(foo);
return true;
}
Я хочу, чтобы иметь возможность вызывать этот метод так:
HashSet<string> a = new HashSet<string>();
List<string> b = new List<string>();
// etc other classes containing "Add" method
if (GetString(ref a)) ... // These aren't all in one place, but spread out
if (GetString(ref b)) ... // and the types are based on what is useful in
if (GetString(ref c)) ... // each particular context.
if (GetString(ref d)) ...
Теперь сам метод компилируется, но я не могу его вызывать. Я получаю лучшее от перегрузки имеет недопустимые аргументы, «Аргумент 1: не удается преобразовать из„иого System.Collections.Generic.List“до„иого System.Collections.Generic.ICollection“»
Я полагаю, что его просто приведение типа необходимая вещь. Итак, я стараюсь:
if (GetString(ref (ICollection<string>)a)) ...
Тогда я получаю «реф или из аргументов должен быть назначаемая переменная». Итак, вопрос в том, может ли это быть сделано на C#, я просто полностью ошибаюсь? Я также рассмотрел передачу Object ref и попытался вызвать «GetType» и «GetMethod» и так, чтобы выяснить, доступен ли «Добавить», но не смог понять, как вызвать метод «Добавить».