将匿名类数组传递给c#方法和循环

本文关键字:方法 循环 数组 | 更新日期: 2023-09-27 18:16:55

我是一个c#新手,想问你一些问题,请帮忙。

我创建了一个变量,里面有3个人使用匿名类,像这样:

var personas = new[] { 
                new {nombre = "Guillermo", apellido = "Pérez", edad = 37}
                , new {nombre = "Juan", apellido = "García", edad = 27}
                , new {nombre = "Maria", apellido = "Rosina", edad = 47}
            };

现在,我尝试对这些项进行迭代,并且我做到了(使用以下代码)

for (int i = 0; i < personas.Length; i++)
{
    var persona = personas[i];
    Console.WriteLine("{0} {1} tiene {2} años.", persona.nombre, persona.apellido, persona.edad);
}

当我想创建一个方法来做我用最后一段代码所做的事情时,问题就来了,这个想法是创建一个方法并将这个对象(在这种情况下是personas)传递给方法并在里面做循环。我所做的是:

 showPersonas(personas);
 static void showPersonas(object[] personsList)        {
        for (int i = 0; i < personsList.Length; i++) {
            var algo = personsList[i];
            Console.WriteLine(personsList[i].nombre); ----> ERROR!!
        }
    }

我想让这个方法做的是做我在for循环中做的事情,能够接收对象,迭代并打印每一项。

谢谢!请大家注意。

将匿名类数组传递给c#方法和循环

我看到两个选项

在我看来,最好的选择是创建类Person。对于已创建的类型,如果在编写属性名称时出现错别字,编译器将在编译期间显示错误,稍后将尝试重命名它。
public class Person
{
    public string Nombre { get: set; }
    public string Apellido { get: set; }
    public string Edad { get: set; }
}

static void showPersonas(Person[] personsList)        
{
    foreach (var algo in personsList) 
    {
        Console.WriteLine(algo.nombre);
    }
}

另一个选项:dynamic关键字。
但是要小心-使用dynamic关键字,您将类型检查移动到运行时。这将抛出相同的异常,你现在得到在编译时,在运行时

static void showPersonas(dynamic[] personsList)        
{
    for (int i = 0; i < personsList.Length; i++) 
    {
        var algo = personsList[i];
        Console.WriteLine(algo.nombre);
    }
}

至于答案,你可以这样做:

static void showPersonas(dynamic[] personsList){
    for (int i = 0; i < personsList.Length; i++){
        var algo = personsList[i];
        Console.WriteLine(personsList[i].nombre);
    }
}

注意如果你的对象中没有出现字段,动态将会抛出异常。

最好的方法就是为这个对象创建一个类,然后使用它。你看,c#不是按照javascriptpython设计的,所以不应该像那样使用。

它是强类型语言,在我看来这是一个优势。