В C # как я могу получить свойства объекта, который находится внутри массива? - PullRequest
1 голос
/ 21 марта 2011

У меня возникают проблемы при попытке обратиться к свойствам объекта, который я вставил в массив, используя следующий метод.

    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 ]

5 голосов
/ 21 марта 2011

У вас почти было это:

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).

2 голосов
/ 21 марта 2011

Самый быстрый ответ на ваш вопрос заключается в том, что вы можете привести объект в массив.

((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 позволяет вам выполнить приведение, но получить нулевое значение, если тип не совпадает.Вот варианты вашего цикла с обоими операторами, чтобы дать вам представление о том, как все может работать:

Ниже я использую 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();
    }
}

В приведенном ниже примере я использую в качестве для попытки приведения, но проверяю, является ли оно нулевым, прежде чем пытаться получить доступ к свойствам.

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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...