web-dev-qa-db-fra.com

Renvoie le type anonyme d'une fonction

Puis-je utiliser un type anonyme comme type de retour dans une fonction, puis des éléments qui renvoient une valeur dans un tableau ou une collection, tout en ajoutant un champ supplémentaire au nouveau tableau/collection? excusez mon pseudocode ...

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"));

}
18
Dkong

C'est une question très populaire . En général, vous ne pouvez pas renvoyer de type anonyme en raison de l'exigence d'un typage fort. Cependant, il existe quelques solutions de contournement.

  1. Créez un type simple pour représenter la valeur de retour. (Voir ici et ici ). Rendez-le simple en générant à partir de l’utilisation .
  2. Créez une méthode d'assistance pour transtyper vers le type anonyme en utilisant un exemple d'instance pour la transtypage.
12
mellamokb

Non vous ne pouvez pas renvoyer un type anonyme à partir de la méthode. Pour plus d'informations, lisez this MSDN doc. Utilisez class ou struct au lieu d'un type anonymous.

Vous devriez lire l'article du blog - Horrible hack: renvoyer une instance de type anonyme

Si vous utilisez Framework 4.0, vous pouvez renvoyer List<dynamic> en veillant à accéder aux propriétés de l'objet anonyme.

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>();
}
14
adatapost

Non, vous ne pouvez pas renvoyer directement un type anonyme, mais vous pouvez le renvoyer à l'aide de l'interface impromptu Quelque chose comme ça:

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
Chris Fulstow

Il suffit d'utiliser et ArrayList 

    public static ArrayList GetMembersItems(string ProjectGuid)
    {
        ArrayList items = new ArrayList(); 

              items.AddRange(yourVariable 
                        .Where(p => p.yourproperty == something)
                        .ToList());
            return items;
    }
2
Alex Z

Utilisez object, pas var. Vous devrez cependant utiliser la réflexion pour accéder aux propriétés en dehors de la portée du type anonyme.

c'est à dire.

private object GetRowGroups(string columnName) 
...
var RowGroupList = new List<object>();
...
1
Plymouth223

À partir de C # 7, vous pouvez retourner une liste de n-uplets:

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());
}

Vous pouvez même donner aux membres des noms de tuple:

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());
}

Cependant, vous avez besoin de System.ValueTuple depuis le gestionnaire de paquets Nuget.

Quoi qu'il en soit, je suggère de donner aux choses un nom clair qui précise leur objectif, en particulier lorsque cela fait partie d'une API publique. Cela dit, vous devriez envisager de créer une classe contenant ces propriétés et renvoyer une liste de ce type.

0
HimBromBeere