0

何かが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();
    }
  }
}
4

4 に答える 4

7

まずはcurrentPersionアイテム集めです。メソッドを使用しSingleて、単一のアイテムにします。

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

(まったく一致しない可能性がある場合は、を使用してから、が nullSingleOrDefaultかどうかを確認します。)currentPersion

次に、キャストしようとした後、currentPerson変数ではなく変数をチェックしていaccademicます。

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

これで、ループも必要なくなりました。最初のセクションで変数を使用し、2 番目accademicのセクションで参照をキャストします。AdminStaff

AdminStaff admin = currentPerson as AdminStaff;
于 2013-04-03T12:54:50.710 に答える
2

where セレクターは 1 人ではなくコレクションを返すため、if ... else ...ビットをループに移動します。foreach

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;
    }       
}
于 2013-04-03T12:53:13.513 に答える
0
if (instance.GetType().IsClass)
{

}

トリックを行う必要があります。

しかし、実際にはこのようにするべきではありません。異なるものを出力するために異なるクラスが必要な場合は、インターフェイスを作成して各タイプに個別に実装する方法をお勧めします。

于 2013-04-03T12:53:12.200 に答える
0

currentPersonコレクションではなく、単一のエンティティのようです。そう、SingleまたはFirstOrDefault同様に機能します。( currentPerson が一意であるかどうかに応じて) isnull チェックを処理するため、使用したい型をテストします。したがって、どのラベルにも値が設定されていない場合は、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();
        }
于 2013-04-03T12:59:13.643 に答える