Кто-нибудь может сказать мне, как хранить и возвращать список строк.
Меня спрашивают, потому что я написал функцию, которая возвращает Collection of string и i
хотите подготовить COM для этого и нужно использовать этот COM (чтобы получить возвращенный список) в
vС++, где я могу расширить некоторые функции, используя этот список строк.
Надеюсь, что все будет ясно...
Спасибо в Advance
Список <string> или строка [] - лучшие варианты.
Вот пример метода, который возвращает список строк:
public static List<string> GetCities()
{
List<string> cities = new List<string>();
cities.Add("Istanbul");
cities.Add("Athens");
cities.Add("Sofia");
return cities;
}
В С# вы можете просто вернуть List<string>
, но вместо этого вы можете вернуть IEnumerable<string>
, поскольку это позволяет ленивую оценку.
Вы можете сохранить фиксированный список строк в виде массива:
string[] myStrings = {"Hello", "World"};
Или динамический список как List<string>
:
List<string> myStrings = new List<string>();
myStrings.Add("Hello");
myStrings.Add("World");
Существует множество способов представления списка строк в .NET, List <string> будучи slickest. Однако вы не можете вернуть это сообщение COM, потому что:
COM не понимает .NET Generics
FxCop скажет вам, что плохая практика возвращает внутреннюю реализацию чего-то (List), а не абстрактного интерфейса (IList/IEnumerable).
Если вы не хотите попасть в действительно страшные объекты Variant SafeArray (не рекомендуется), вам нужно создать объект 'collection', чтобы ваш COM-клиент мог перечислять строки.
Что-то вроде этого (не скомпилировано - это просто пример, чтобы вы начали):
[COMVisible(true)]
public class CollectionOfStrings
{
IEnumerator<string> m_enum;
int m_count;
public CollectionOfStrings(IEnumerable<string> list)
{
m_enum = list.GetEnumerator();
m_count = list.Count;
}
public int HowMany() { return m_count; }
public bool MoveNext() { return m_enum.MoveNext(); }
public string GetCurrent() { return m_enum.Current; }
}
(см. http://msdn.microsoft.com/en-us/library/bb352856.aspx для получения дополнительной справки)
Вчера вы спросили, как это сделать через COM-взаимодействие! Почему шаг назад?
Как вернуть коллекцию строк из С# в С++ через COM-взаимодействие
public static IList<string> GetStrings()
{
foreach( var item in GetStringItems())
yield return item;
}