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

在C#中,如何获取数组中对象的属性?,c#,arrays,object,C#,Arrays,Object,尝试引用已使用以下方法插入到数组中的对象的属性时遇到问题 public static void AddEmployees() { string empID; decimal empWage; int count = 0; do { Console.Write("Please enter the employee ID number: "); empID

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

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

    }
你差点就成功了:

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

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

如何修复它:

使用
列表代替
对象[]
,例如:

public static List<Employee> employees  = new List<Employee>();
最后,
CreateEmployee
的返回类型应该是
Employee
(而不是
object
)。

您几乎拥有了它:

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

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

如何修复它:

使用
列表代替
对象[]
,例如:

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

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

对您的问题最快的回答是可以在数组中强制转换对象

((Employee)obj).empID
您还没有展示如何定义数组;如果它是一个Employee数组,那么您可以安全地在foreach中进行强制转换,但是由于您遇到了错误,我猜您的数组可能是object或继承层次结构中更高的某个

如果是这样的话,下面是我所指的语法:

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>();
在下面的示例中,我使用as尝试强制转换,但在尝试访问属性之前,我会检查它是否为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();
    }
}

对于您的问题,最快的答案是可以在数组中投射对象

((Employee)obj).empID
您还没有展示如何定义数组;如果它是一个Employee数组,那么您可以安全地在foreach中进行强制转换,但是由于您遇到了错误,我猜您的数组可能是object或继承层次结构中更高的某个

如果是这样的话,下面是我所指的语法:

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>();
在下面的示例中,我使用as尝试强制转换,但在尝试访问属性之前,我会检查它是否为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();
    }
}

问题是我得到了这个错误:“object”不包含“empID”的定义,并且找不到接受“object”类型的第一个参数的扩展方法“empID”。显然我遗漏了一些东西。@Tharkis:employeeArray的类型是什么?公共静态对象[]employeeArray=新对象[5];问题是我得到了这个错误:“object”不包含“empID”的定义,并且找不到接受“object”类型的第一个参数的扩展方法“empID”。显然我遗漏了一些东西。@Tharkis:employeeArray的类型是什么?公共静态对象[]employeeArray=新对象[5];您可能正在将员工存储到对象[]数组中。将数组更改为Employee[]。或者在foreach语句中使用
Employee obj
而不是
var obj
。喜欢这里的
List
。@汉斯:如果这只是一个猜测,那么这是我最近看到的最令人印象深刻的心理调试技巧之一。或者可能只是我:)@Jon:看起来确实是你,很难令人信服地猜测。@Hans:有点迷路了。前面的评论是赞扬,希望我没有被误解。您可能正在将员工存储到object[]数组中。将数组更改为Employee[]。或者在foreach语句中使用
Employee obj
而不是
var obj
。喜欢这里的
List
。@汉斯:如果这只是一个猜测,那么这是我最近看到的最令人印象深刻的心理调试技巧之一。或者可能只是我:)@Jon:看起来确实是你,很难令人信服地猜测。@Hans:有点迷路了。前面的评论是赞扬,希望我没有被误解。这实际上是我最后使用的方法。感谢达科他州的大卫,这实际上是我最后使用的方法。谢谢达科他州的大卫