在C#中如何获取数组内对象的属性?

时间:2011-03-21 00:58:20

标签: c# arrays object

我无法尝试使用以下方法引用已插入数组的对象的属性。

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

2 个答案:

答案 0 :(得分:5)

你几乎拥有它:

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

<强>更新

如果employeeArray的类型为object[],则无法直接引用类Employee中定义的属性。

如何修复它:

而不是object[]使用List<Employee>,例如:

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

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

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

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

答案 1 :(得分: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#有两个非常强大的运算符: is as 运算符。 运算符将允许您有条件地检查某些内容是否是某种类型,并且as运算符让您尝试转换,但如果类型不匹配则获取空值。以下是使用两个运算符的循环变体,以便您了解事物的工作方式:

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

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

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

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