Возвращать анонимный тип из функции
Могу ли я использовать анонимный тип как возвращаемый тип в функции, а затем передать возвращаемое значение в массив или коллекцию какого-либо типа, а также добавить дополнительное поле в новый массив/коллекцию? извините мой псевдокод...
private var GetRowGroups(string columnName)
{
var groupQuery = from table in _dataSetDataTable.AsEnumerable()
group table by new { column1 = table[columnName] }
into groupedTable
select new
{
groupName = groupedTable.Key.column1,
rowSpan = groupedTable.Count()
};
return groupQuery;
}
private void CreateListofRowGroups()
{
var RowGroupList = new List<????>();
RowGroupList.Add(GetRowGroups("col1"));
RowGroupList.Add(GetRowGroups("col2"));
RowGroupList.Add(GetRowGroups("col3"));
}
Ответы
Ответ 1
Это очень популярный вопрос. В общем случае вы не можете вернуть анонимный тип из-за требования сильной типизации. Однако есть несколько способов обхода.
Ответ 2
Нет, вы не можете вернуть анонимный тип из метода. Для получения дополнительной информации прочитайте этот документ MSDN. Используйте class
или struct
вместо типа anonymous
.
Вы должны прочитать сообщение в блоге - Ужасный громовой взлом: возврат экземпляра анонимного типа
Если вы используете фреймворк 4.0, вы можете вернуть List<dynamic>
, но будьте осторожны, чтобы получить доступ к свойствам анонимного объекта.
private List<dynamic> GetRowGroups(string columnName)
{
var groupQuery = from table in _dataSetDataTable.AsEnumerable()
group table by new { column1 = table[columnName] }
into groupedTable
select new
{
groupName = groupedTable.Key.column1,
rowSpan = groupedTable.Count()
};
return groupQuery.ToList<dynamic>();
}
Ответ 3
Нет, вы не можете возвращать анонимный тип напрямую, но вы можете вернуть его, используя импровизированный интерфейс. Что-то вроде этого:
public interface IMyInterface
{
string GroupName { get; }
int RowSpan { get; }
}
private IEnumerable<IMyInterface> GetRowGroups()
{
var list =
from item in table
select new
{
GroupName = groupedTable.Key.column1,
RowSpan = groupedTable.Count()
}
.ActLike<IMyInterface>();
return list;
}
Ответ 4
Просто используйте и ArrayList
public static ArrayList GetMembersItems(string ProjectGuid)
{
ArrayList items = new ArrayList();
items.AddRange(yourVariable
.Where(p => p.yourproperty == something)
.ToList());
return items;
}
Ответ 5
Используйте object
, а не var
. Однако вам придется использовать отражение для доступа к свойствам вне области анонимного типа.
то есть.
private object GetRowGroups(string columnName)
...
var RowGroupList = new List<object>();
...
Ответ 6
Верните кортеж, функцию С# 7. Вы можете прочитать больше здесь: https://blogs.msdn.microsoft.com/dotnet/2016/08/24/whats-new-in-csharp-7-0/
Ответ 7
Из С# 7 вы можете вернуть список кортежей:
private IEnumerable<(string, string)> GetRowGroups(string columnName)
{
return from table in _dataSetDataTable.AsEnumerable()
group table by new { column1 = table[columnName] }
into groupedTable
select (groupedTable.Key.column1, groupedTable.Count());
}
Вы даже можете дать членам кортежа имена:
private IEnumerable<(string groupName, string rowSpan)> GetRowGroups(string columnName)
{
return from table in _dataSetDataTable.AsEnumerable()
group table by new { column1 = table[columnName] }
into groupedTable
select (groupedTable.Key.column1, groupedTable.Count());
}
Однако вам нужен System.ValueTuple
из диспетчера пакетов Nuget.
В любом случае, я предлагаю дать ясное имя вещам, которое включает их предназначение, в частности, когда это является частью публичного API. Сказав это, вы должны создать класс, который содержит эти свойства и вернуть список этого типа.