Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 阵列列表概念问题_C#_.net_Arraylist_Console Application - Fatal编程技术网

C# 阵列列表概念问题

C# 阵列列表概念问题,c#,.net,arraylist,console-application,C#,.net,Arraylist,Console Application,我曾尝试在数组列表中添加两种类型的对象,然后尝试显示它们,但不知何故它不起作用。我是否需要使用2个数组列表对象,或者它将如何工作 错误消息: 无法将类型为“ArrayList\u Practice.Student”的对象强制转换为类型 “ArrayList_Practice.Employees” 类程序 { 静态void Main(字符串[]参数) { 学生st=null; 员工emp=null; ArrayList al=新的ArrayList(); Console.WriteLine(“输入

我曾尝试在数组列表中添加两种类型的对象,然后尝试显示它们,但不知何故它不起作用。我是否需要使用2个数组列表对象,或者它将如何工作

错误消息:

无法将类型为“ArrayList\u Practice.Student”的对象强制转换为类型 “ArrayList_Practice.Employees”

类程序
{
静态void Main(字符串[]参数)
{
学生st=null;
员工emp=null;
ArrayList al=新的ArrayList();
Console.WriteLine(“输入记录”);
对于(int i=0;i<2;i++)
{
st=新生();
控制台。写入线(“输入滚动”);
st.roll=int.Parse(Console.ReadLine());
Console.WriteLine(“输入名称”);
st.name=Console.ReadLine();
控制台。写入线(“进入课程”);
st.course=Console.ReadLine();
新增(st);
emp=新员工();
Console.WriteLine(“输入empID”);
emp.empID=int.Parse(Console.ReadLine());
Console.WriteLine(“输入名称”);
emp.name=Console.ReadLine();
al.Add(emp);
}
Console.WriteLine(///Show Records//);
对于(int i=0;i<2;i++)
{
Console.WriteLine(“Roll”+((学生)al[i]).Roll.ToString());
Console.WriteLine(“Name”+((学生)al[i]).Name);
Console.WriteLine(“课程”+((学生)al[i])课程;
Console.WriteLine(“EmpID”+((Employees)al[i]).EmpID.ToString();
Console.WriteLine(“EmpName”+((雇员)al[i]).name);
}
Console.ReadKey();
}
}
班级学生
{
公共int roll{get;set;};
公共字符串名称{get;set;};
公共字符串进程{get;set;};
}
班级员工
{
公共int empID{get;set;};
公共字符串名称{get;set;};
}

}

在数组列表中,第0个元素是学生类型,第1个元素是员工类型

在循环中,然后尝试将第0个元素强制转换为employee以显示empID。 因此,你需要意识到这一点

您需要进行适当的强制转换检查,以使循环正常工作。 检查元素是学生还是员工,并相应显示

for (int i = 0; i < al.Count; i++)
{
 var student = al[i] as Student;

 if (student != null)
 {
        Console.WriteLine("Roll "+ student.roll.ToString());
        Console.WriteLine("Name "+ student.name);
        Console.WriteLine("Course "+ student.course);
 }
 else
 {
  var employee  = al[i] as Employee;

  if (employee  != null)
  {
        Console.WriteLine("EmpID "+ employee.empID.ToString());
        Console.WriteLine("EmpName "+ employee.name);
  }
 }
}
for(int i=0;i
虽然这可以解决您的问题,但通常您应该使用强类型集合。
e、 g.
List
List
您的第一个元素是一个
学生
,您试图在循环的第一次迭代中将其强制转换为
员工
。这就是为什么在运行时会得到一个
InvalidCastException
。不要使用
数组列表
,请改用强类型泛型集合。对于ex:

如果您想显示公共属性,并且想将
学生
员工
存储到同一个列表中,您可以为他们创建一个公共
界面
,并实现它。然后您可以拥有一个
列表
并存储您的实例。但是如果您有不同的属性(看起来您有)您不能使用公共接口或基类访问它们,相反,您可以简单地创建一个扩展方法并使用
Reflection
显示所有属性值,如下所示:

public static class Extensions
{
    public static string DisplayPerson<T>(this T source)
    {
        if(source == null) throw new ArgumentNullException("source");

        var flags = BindingFlags.Instance | BindingFlags.Public;
        var properties = source.GetType().GetProperties(flags);

        if (properties.Any())
        {
            StringBuilder sb = new StringBuilder();
            foreach (var prop in properties)
            {
                sb.AppendFormat("{0} : {1}", prop.Name, prop.GetValue(source));
                sb.AppendLine();
            }
            return sb.ToString();
        }
        return string.Empty;
    }

}
公共静态类扩展
{
公共静态字符串DisplayPerson(此T源)
{
如果(source==null)抛出新的ArgumentNullException(“source”);
var flags=BindingFlags.Instance | BindingFlags.Public;
var properties=source.GetType().GetProperties(标志);
if(properties.Any())
{
StringBuilder sb=新的StringBuilder();
foreach(属性中的var属性)
{
sb.AppendFormat(“{0}:{1}”,prop.Name,prop.GetValue(source));
(某人);
}
使某人返回字符串();
}
返回字符串。空;
}
}
然后从循环中调用它:

for (int i = 0; i < al.Count; i++)
{
    Console.WriteLine(al[i].DisplayPerson());
}
for(int i=0;i
编辑:使用公共界面的另一种方式

public interface IPerson
{
    string Name { get; set; }
    int Id { get; set; }
}

class Student : IPerson
{
   /* implement the properties */
}

class Employees : IPerson
{
    /* implement the properties */
}

static void Main(string[] args)
{
    List<IPerson> personList = new List<IPerson>();

    personList.Add(new Student {/* set properties */});
    personList.Add(new Employee {/* set properties */});

    //  use a loop and display your properties without casting
}
公共接口IPerson
{
字符串名称{get;set;}
int Id{get;set;}
}
班级学生:IPerson
{
/*实现属性*/
}
员工类别:IPerson
{
/*实现属性*/
}
静态void Main(字符串[]参数)
{
List personList=新列表();
添加(新学生{/*集属性*/});
添加(新员工{/*设置属性*/});
//使用循环并在不强制转换的情况下显示属性
}

您需要两个列表,因为您试图在数组中存储两种不同类型的对象。虽然这是可能的,但最好保持简单:为学生和员工设置一个数组

我不知道你为什么要两人一组同时输入学生和员工的记录。员工是否以某种方式与学生有联系?学生是雇员吗?如果是这样,您最好创建一个表示student employee或其他关系的对象,并用该类型的项填充一个列表


另外,现在是2014年,您不应该使用
ArrayList
。至少,使用
列表

-1,问号不够。@Blorgbeard添加了错误消息,请收回-1。如果我假设使用列表,在上述情况下应该是什么?@androidrill如果你想存储
员工
Stu
public interface IPerson
{
    string Name { get; set; }
    int Id { get; set; }
}

class Student : IPerson
{
   /* implement the properties */
}

class Employees : IPerson
{
    /* implement the properties */
}

static void Main(string[] args)
{
    List<IPerson> personList = new List<IPerson>();

    personList.Add(new Student {/* set properties */});
    personList.Add(new Employee {/* set properties */});

    //  use a loop and display your properties without casting
}