【问题标题】:In C# how do I get the properties of an object that is inside an array?在 C# 中,如何获取数组内对象的属性?
【发布时间】:2011-03-21 00:58:19
【问题描述】:

我在尝试使用以下方法引用已插入数组的对象的属性时遇到问题。

    public static void AddEmployees()
    {
        string empID;
        decimal empWage;
        int count = 0;
        do
        {
            Console.Write("Please enter the employee ID number: ");
            empID = Convert.ToString(Console.ReadLine());

            Console.Write("Please enter the employee wage: ");
            empWage = Convert.ToDecimal(Console.ReadLine());

            var employeeObj = CreateEmployee(empID, empWage);
            employeeArray[count] = employeeObj;
            ++count;

        } while (count < 6);

    }

我想以某种可读格式打印出此数组中的信息,但我不知道如何引用 empWage 或 empID。理想情况下,我想使用某种 foreach 循环,如下所示:

    public static void DisplayEmployees()
    {
        foreach (var obj in employeeArray)
        {
            Console.WriteLine("Employee ID: {0}", empID);
            Console.WriteLine("Employee Wage: {0}", empWage);
            Console.WriteLine();
        }
    }

【问题讨论】:

  • 您可能正在将员工存储到 object[] 数组中。将数组更改为 Employee[]。或者在 foreach 语句中使用Employee obj 而不是var obj。在这里支持List&lt;Employee&gt;
  • @Hans:如果这只是一个猜测,那么它是我一段时间以来看到的最令人印象深刻的心灵调试壮举之一。或者也许只是我:)
  • @Jon:看起来确实是你,很难令人信服地猜测。
  • @Hans:有点失去你了。之前的评论是表扬,希望我没有被误解。

标签: c# arrays object


【解决方案1】:

你差点就吃完了:

foreach (var obj in employeeArray)
{
    Console.WriteLine("Employee ID: {0}", obj.empID);
    Console.WriteLine("Employee Wage: {0}", obj.empWage);
    Console.WriteLine();
}

更新:

如果employeeArrayobject[] 类型,则不能直接引用类Employee 中定义的属性。

如何解决:

List&lt;Employee&gt;代替object[],例如:

public static List<Employee> employees  = new List<Employee>();

您还需要更改将项目添加到列表的方式:

var employeeObj = CreateEmployee(empID, empWage);
employees.Add(employeeObj);

最后CreateEmployee的返回类型应该是Employee(不是object)。

【讨论】:

  • 问题是我得到这个错误:'object'不包含'empID'的定义,并且找不到接受'object'类型的第一个参数的扩展方法'empID'。显然我错过了一些东西。
  • @Tharkis:employeeArray的类型是什么?
  • 公共静态对象[] employeeArray = new object[5];
【解决方案2】:

您的问题的最快答案是您可以将对象投射到数组中。

((Employee)obj).empID

你还没有展示你是如何定义数组的;如果它是一个 Employee 数组,那么您可以安全地在 foreach 中进行强制转换,但是由于您遇到错误,我猜测您的数组可能是对象或继承层次结构中更高的东西。

如果是这样的话,我在语法上指的是:

foreach (var obj in employeeArray)
{
    Console.WriteLine("Employee ID: {0}", ((Employee)obj).empID);
    Console.WriteLine("Employee Wage: {0}", ((Employee)obj).empWage);
    Console.WriteLine();
}

尽管强制转换适用于许多情况,但这种代码很脆弱,因为它依赖于一堆假设,其中最大的假设是数组中的所有内容都是 Employee 类型。而不是做出假设,您可以让编译器通过使用通用列表而不是普通数组来为您强制执行此操作。为此,您对集合的定义是:

List<Employee> employeeArray = new List<Employee>();

您可以使用的最后一种技术:C# 有两个用于强制转换的运算符:isas 运算符。 is 运算符将允许您有条件地检查某物是否为某种类型,而 as 运算符让您尝试进行强制转换,但如果类型不匹配,则获取 null 值。以下是两个运算符的循环变体,让您了解事情的运作方式:

下面我使用 is 在访问属性之前验证类型:

foreach (var obj in employeeArray)
{
    if (obj is Employee)
    {
        Console.WriteLine("Employee ID: {0}", obj.empID);
        Console.WriteLine("Employee Wage: {0}", obj.empWage);
        Console.WriteLine();
    }
}

在下面我使用 as 来尝试强制转换,但我在尝试访问属性之前检查它是否为空。

foreach (var obj in employeeArray)
{
    var emp = obj as Employee;
    if (emp != null )
    {
        Console.WriteLine("Employee ID: {0}", obj.empID);
        Console.WriteLine("Employee Wage: {0}", obj.empWage);
        Console.WriteLine();
    }
}

【讨论】:

  • 这实际上是我最终使用的方法。感谢达科他州的大卫
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 2021-07-13
  • 1970-01-01
  • 2018-11-14
  • 2018-11-28
相关资源
最近更新 更多