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

您可以使用即兴界面来做到这一点。

于 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 回答