我有一个患者班:
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多个界面,所以我可以将相关数据分组进行计算。我也不想每次都输入所有这些属性。智能感的缺乏使我远离过去使用动态语言。 (我不懒,我效率很高!)
答案 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
实现了这些属性,这就可以了。