2

私は患者クラスを持っています:

class Patient {
  public string First_Name { get; set; }
  public string Last_Name { get; set; }
  public DateTime Date_of_Birth { get; set; }
}

私もインターフェースを持っています:

interface IPerson {
  string First_Name { get; }
  string Last_Name { get; }
}

このコンソールアプリケーションでは、Display_Personメソッドを機能させたいと思います。コンパイルされますが、PatientがIPersonを実装していないため、実行時エラーがスローされます。

class Program {
  static void Main(string[] args) {
    Patient p = new Patient { 
      First_Name = "Charles", Last_Name = "Lambert",
      Date_of_Birth = new DateTime(1976,5,12),
    };
    Display_Person(p);
  }

  static void Display_Person(dynamic person) {
    IPerson p = person;
    Console.WriteLine("{0}, {1}", p.Last_Name, p.First_Name);
  }
}

PatientにIPersonインターフェイスを実装させずに、Display_Personメソッドを機能させるためにどのようなコード変更を行うことができますか?再利用可能なソリューションをお勧めします。

更新:インテリセンスを取得できるように、これを機能させたいと思います。この例のささいなことを過ぎて見てください。それは短く、私の問題を説明するところまでです。これが1003のローン申請である場合(印刷された場合は本のサイズです)、計算のために関連データをグループ化できるように、クラスに20以上のインターフェースを適用したくありません。また、これらすべてのプロパティを毎回入力する必要はありません。インテリセンスの欠如により、過去に動的言語を使用することから私を遠ざけました。(私は怠惰ではありません私は効率的です!)

4

4 に答える 4

4

そのためにImpromptu Interfaceを使用できます。

于 2011-10-08T02:50:21.327 に答える
3

本当に動的を使用したい場合は、なぜ変換するのですか?

static void Display_Person(dynamic person) {
    Console.WriteLine("{0}, {1}", person.Last_Name, person.First_Name);
}

しかし、Patient が IPerson を実装してくれればなお良いと思います。設計の観点からははるかに理にかなっており、タイプ セーフとは、実行時ではなくコンパイル時にエラーが検出されることを意味します。

于 2011-10-08T02:38:23.383 に答える
0

いいえ!私は(IPatientを実装せずに)それが可能だとは思いません。IPatientインターフェイスを実装する必要があります

class Patient : IPatient {}

または鋳造物を取り除きます。

static void Display_Person(dynamic person) 
{
    Console.WriteLine("{0}, {1}", person.Last_Name, person.First_Name);
}
于 2011-10-08T02:32:09.573 に答える
0

IPerson は不要です。次のDisplay_Personようにしてください:

static void Display_Person(dynamic person) {
    Console.WriteLine("{0}, {1}", person.Last_Name, person.First_Name);
}

personこれらのプロパティを実装している限り、これは正常に機能します。

于 2011-10-08T02:38:42.130 に答える