【问题标题】:Pass array of anonymous classes to method and loop c#将匿名类数组传递给方法和循环c#
【发布时间】:2016-11-08 19:09:42
【问题描述】:

我是 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);
}

当我想创建一个方法来执行我对最后一段代码所做的事情时,问题就来了,我的想法是创建一个方法并将这个对象(在本例中为角色)传递给该方法并在内部执行循环.我做的是这样的:

 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 循环所做的操作,以便能够接收对象、迭代并打印每个项目。

谢谢!让您全神贯注。

【问题讨论】:

  • 您是否有理由不创建具体类而不是匿名对象?似乎这一切都可以通过一个简单的类实现来解决。你的方法名称已经描述了你应该接收什么样的对象,所以我个人认为匿名类型不是这里的方法。
  • 考虑到自定义类将少于 10 行代码,我认为没有理由通过使用 dynamic 或反射来牺牲编译类型的安全性。创建一个类并将其用作数组(或IEnumerable&lt;&gt;)作为输入参数的类型。
  • 谢谢!是的,原因是我正在学习数组,所以他们确实举了一个使用匿名类数组的例子......如果我在同一个代码块中执行循环,它会很好,但是如果我尝试创建一种循环然后问题开始的方法,因为我不知道这些类是什么...... :-(

标签: c# class loops anonymous


【解决方案1】:

我看到两个选项

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

    }
}

【讨论】:

  • 如果您有两个选择并且更喜欢其中一个,我会说最好先给出一个。例如“我个人会做 X,但你可以做 Y”。
  • @DStanley - 按照你的建议进行了更改,但我始终确信,人们最好记住最后一件事:)
  • 这是一个很好的观点。我总是害怕他们会接受第一个答案并停止阅读,但你可能是对的。我仍然赞成,我很感激考虑。
  • 感谢您的及时回答...是的,我可以做一个强类型类,我更愿意这样做,但是,如果不做一个类,使用完全相同的匿名类是可能的吗?
  • 是的,有可能 - 使用 dynamic 关键字查看我的答案的另一个选项。
【解决方案2】:

至于答案你可以这样:

static void showPersonas(dynamic[] personsList){

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

    }
}

请注意,如果您的对象中未显示字段,则动态将引发异常。

至于这样做的最佳方法,只需为该对象创建类并使用它。你看,C# 不是设计成 javascriptpython 的,应该not 像一个那样使用。

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

【讨论】:

  • 感谢您的回答...我没有尝试使用 javascript 或 phyton,我只是从我的书中学习...他们告诉我我可以做匿名类、枚举和结构,现在我正在学习如何做数组...所以我的想法是练习数组循环... :-)
猜你喜欢
  • 2012-12-24
  • 1970-01-01
  • 2012-11-24
  • 1970-01-01
  • 1970-01-01
  • 2011-07-03
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多