繁体   English   中英

查看某物是否为类

[英]See if something is of type class

我试图检查是否某些东西是c#中的某种类型的类。 它根据类型是哪种类在表单上打印出某些标签。 到目前为止,这是我的工作,它适用于“ if”语句。 但是,出现“无法转换类型的对象”错误。 在这种情况下可以使用if-else语句吗?

public void ShowStaffData(string pName)
{
  //Gets Staff Details from the name slected int he list box in the form
  people.CreatePeople();
  var currentPerson = 
    people.person.Where(p => p.Forename + " " + p.Surname == pName);

  // How the info is printed out if person selected in 
  // a member of Accademic Staff
  AccademicStaff accademic = currentPerson as AccademicStaff;

  if (currentPerson!=null)
  {
    foreach (AccademicStaff accStaff in currentPerson)
    {
      label9.Text = accStaff.Forename + " " + accStaff.Surname;
      label10.Text = accStaff.IdentificationNumber.ToString();
      label11.Text = accStaff.DateOfBirth;
      label12.Text = accStaff.Address;
      label13.Text = accStaff.Office;
      label14.Text = accStaff.School;
      label15.Text = accStaff.ModuleLeaderOf;
      label16.Text = accStaff.ProgramLeaderOf;
    }
  }      
  else
  {
    // How the info is printed out if person selected in 
    // a member of Admin Staff

    foreach (AdminStaff admin in currentPerson)
    {
      label9.Text = admin.Forename + " " + admin.Surname;
      label10.Text = admin.IdentificationNumber.ToString();
      label11.Text = admin.DateOfBirth;
      label12.Text = admin.Address;
      label13.Text = admin.Office;
      label6.Text = "Job Role";
      label14.Text = admin.JobRole;
      label7.Dispose();
      label8.Dispose();
      label15.Dispose();
      label16.Dispose();
    }
  }
}

首先, currentPersion是项目的集合。 使用Single方法将其设为单个项目:

var currentPerson =
  people.person.Where(p => p.Forename + " " + p.Surname == pName).Single();

(如果可能根本没有匹配SingleOrDefault ,则可以使用SingleOrDefault ,然后检查currentPersion是否为null。)

其次,尝试投射后,您要检查currentPerson变量而不是accademic变量:

AccademicStaff accademic = currentPerson as AccademicStaff;
if (accademic != null)

现在您也不需要循环。 在第一部分中使用accademic变量,在第二部分中将引用转换为AdminStaff

AdminStaff admin = currentPerson as AdminStaff;

if ... else ...位移到foreach循环中,因为where选择器将返回一个集合,而不是一个人。

var currentPerson = people.person.Where(p => p.Forename + " " + p.Surname == pName);

foreach (var person in currentPerson)
{

    AccademicStaff accStaff = person as AccademicStaff;
    if (accStaff != null)
    {
        label9.Text = accStaff.Forename + " " + accStaff.Surname;
        label10.Text = accStaff.IdentificationNumber.ToString();
        label11.Text = accStaff.DateOfBirth;
        label12.Text = accStaff.Address;
        label13.Text = accStaff.Office;
        label14.Text = accStaff.School;
        label15.Text = accStaff.ModuleLeaderOf;
        label16.Text = accStaff.ProgramLeaderOf;
    }
    else
    {
        // How the info is printed out if person selected in a member of Admin Staff
        label9.Text = person.Forename + " " + person.Surname;
        label10.Text = person.IdentificationNumber.ToString();
        label11.Text = person.DateOfBirth;
        label12.Text = person.Address;
        label13.Text = person.Office;
        label6.Text = "Job Role";
        label14.Text = person.JobRole;
    }       
}

我删除了标签上对Dispose()的调用,它们没有任何意义。

编辑您可以将其缩短如下:

var currentPerson = people.person.Where(p => p.Forename + " " + p.Surname == pName);

foreach (var person in currentPerson)
{

    label9.Text = person.Forename + " " + person.Surname;
    label10.Text = person.IdentificationNumber.ToString();
    label11.Text = person.DateOfBirth;
    label12.Text = person.Address;
    label13.Text = person.Office;

    AccademicStaff accStaff = person as AccademicStaff;
    if (accStaff != null)
    {
        label14.Text = accStaff.School;
        label15.Text = accStaff.ModuleLeaderOf;
        label16.Text = accStaff.ProgramLeaderOf;
    }
    else
    {
        label6.Text = "Job Role";
        label14.Text = person.JobRole;
    }       
}
if (instance.GetType().IsClass)
{

}

应该做到的。

但是,您实际上不应该这样做,如果您需要不同的类来打印出不同的内容,那么我建议您沿着创建接口并将其分别在每种类型上实现的路线走下去。

看起来currentPerson是单个实体而不是集合。 因此SingleFirstOrDefault也会同样有效; (根据是否有currentPerson是唯一的或不)再进行试验,因为我更喜欢使用该类型is由于它处理空校验。 因此,如果您的标签都没有填充,则意味着从linq语句返回的人都不是两种类型。

    people.CreatePeople();
    var currentPerson = people.person.Where(p => p.Forename + " " + p.Surname == pName).Single();

        if(currentPerson is AcademicStaff)
        {
            label9.Text = accStaff.Forename + " " + accStaff.Surname;
            label10.Text = accStaff.IdentificationNumber.ToString();
            label11.Text = accStaff.DateOfBirth;
            label12.Text = accStaff.Address;
            label13.Text = accStaff.Office;
            label14.Text = accStaff.School;
            label15.Text = accStaff.ModuleLeaderOf;
            label16.Text = accStaff.ProgramLeaderOf;
        }
        else if(currentPerson is AdminStaff)
        {
            label9.Text = admin.Forename + " " + admin.Surname;
            label10.Text = admin.IdentificationNumber.ToString();
            label11.Text = admin.DateOfBirth;
            label12.Text = admin.Address;
            label13.Text = admin.Office;
            label6.Text = "Job Role";
            label14.Text = admin.JobRole;
            label7.Dispose();
            label8.Dispose();
            label15.Dispose();
            label16.Dispose();
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM