我可以像这样工作吗?

时间:2011-10-08 02:27:52

标签: c# dynamic duck-typing

我有一个患者班:

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);
  }
}

在没有患者实施IPerson界面的情况下更改了哪些代码,我可以使Display_Person方法工作吗?我更喜欢可重复使用的解决方案。

更新:我想要这个工作,所以我可以获得intellisense。请仔细看看这个例子的微不足道。它很简短,也没有解释我的问题。如果这是1003贷款申请(打印时是一本书的大小),我不想在我的班级应用20多个界面,所以我可以将相关数据分组进行计算。我也不想每次都输入所有这些属性。智能感的缺乏使我远离过去使用动态语言。 (我不懒,我效率很高!)

4 个答案:

答案 0 :(得分:4)

您可以使用Impromptu Interface来执行此操作。

答案 1 :(得分:3)

如果真的想要使用动态,那么转换的原因是什么?

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

但是如果患者实施了IPerson,我仍然会更喜欢。从设计的角度来看,它会更有意义,类型安全意味着任何错误都会在编译时而不是运行时被捕获。

答案 2 :(得分:0)

没有!我认为(没有实施IPatient)是可能的。您必须实现IPatient接口

class Patient : IPatient {}

或删除施法。

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

答案 3 :(得分:0)

IPerson是不必要的。就像这样Display_Person

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

只要person实现了这些属性,这就可以了。