2016-11-08 124 views
2

我是c#中的新手,想问你一些问题,请帮忙。将匿名类的数组传递给方法和循环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循环,才能够接收对象,迭代并打印出每个项目。

谢谢!为你所有的关注。

+1

你有没有创建具体类而不是匿名对象的参数?看来这将全部通过简单的类实现来解决。你的方法名已经描述了你应该接受什么类型的对象,所以我个人认为匿名类型不是这里的一种方式。 –

+0

考虑到自定义类将少于10行代码,我认为没有理由通过使用'dynamic'或reflection来牺牲编译型安全性。创建一个类并将其用作数组(或者'IEnumerable <>')作为输入参数的类型。 –

+0

谢谢!是的,原因是我正在学习数组,所以他们确实使用了一个匿名类数组的例子......如果我在同一代码块中执行循环,它会运行良好,但如果我尝试创建一个循环的方法,然后问题开始,因为我不知道这些类是什么... :-( –

回答

0

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

static void showPersonas(dynamic[] personsList){ 

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

    } 
} 

要知道什么样的动态会抛出异常,如果不现场在你的对象呈现。

至于最好的方法来做到这一点,只需创建此对象的类并使用它。你看,C#不是被设计成javascriptpython而应该是而不是可以像一个一样使用。

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

+0

感谢您的答案...我没有尝试使用JavaScript或phyton,我只是学习从我的书...他们告诉我我可以做匿名类,枚举和结构,现在我正在学习如何做数组... ...所以我的想法是练习数组循环... :-) –

4

我看到两个选项

在我看来

最好的选择是创建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); 

    } 
} 
+0

如果您有两个选项,并且更喜欢他们我会说最好先给那个人。例如“我个人会做X,但你可以做Y”。 –

+0

@DStanley - 按照你的建议改变了,但我总是确定,人们更好地记住了最后一件事情:) – Fabio

+0

这是一个很好的观点。我总是害怕他们会采取第一个答案,并停止阅读,但你可能是对的。我仍然赞成,我赞赏考虑。 –