2011-09-21 16 views
13

¿Puedo usar un tipo anónimo como tipo de retorno en una Función y luego agregar ese valor devuelto en una matriz o colección al mismo tiempo que agrego un campo adicional a la nueva matriz/colección? disculpen mi pseudocódigo ...Devolver Tipo anónimo desde una función

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

} 
+0

posible duplicado de [Acceso a C# Anónimo Tipo objetos] (http://stackoverflow.com/questions/713521/accessing-c-sharp -anonymous-type-objects) – nawfal

+0

posible duplicado de [¿Devolver el tipo anónimo?] (http://stackoverflow.com/questions/534690/return-anonymous-type) –

Respuesta

11

Esto es very popular question. En general, no puede devolver un tipo anónimo debido a la necesidad de una escritura fuerte. Sin embargo, hay un par de soluciones.

  1. Cree un tipo simple para representar el valor de retorno. (Ver here y here). Hazlo simple por generating from usage.
  2. Crea un método de ayuda al cast to the anonymous type usando una instancia de muestra para el casting.
+1

Siempre cite un pequeño fragmento de enlaces externos. En este caso, el primero está roto, por lo que su respuesta es bastante inútil. – Teejay

+0

"generando desde el uso" el enlace está roto – dlchambers

+0

@dlchambers: Gracias. Cambié el enlace para usar un archivo de la máquina de retorno. – mellamokb

12

No, no puede retorno un tipo anónimo del método. Para obtener más información, lea this MSDN doc. Use class o struct en lugar de un tipo anonymous.

Debe leer entrada del blog - Horrible grotty hack: returning an anonymous type instance

Si está utilizando Framework 4.0, entonces puede regresar List<dynamic> pero tenga cuidado de acceder a las propiedades del objeto anónimo.

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

No, no puede devolver un tipo anónimo directamente, pero puede devolverlo usando impromptu interface. Algo como esto:

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; 
} 
+1

Lindo, sin embargo, no estoy tan seguro de que esto sea más fácil que simplemente hacer el tipo concreto ... (las herramientas en IDE pueden ayudar) –

1

Uso object, no var. Sin embargo, tendrá que usar la reflexión para acceder a las propiedades fuera del alcance del tipo anónimo.

es decir

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

Esto más tarde se puede acceder a través de 'dynamic' (C# 4) ... sin embargo pierde todo tipo de seguridad práctica. –

2

Sólo tiene que utilizar y ArrayList

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

       items.AddRange(yourVariable 
         .Where(p => p.yourproperty == something) 
         .ToList()); 
      return items; 
    } 
Cuestiones relacionadas