Могу ли я получить динамическую работу, как это? - PullRequest
2 голосов
/ 08 октября 2011

У меня есть класс Patient:

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 работал?Я бы предпочел решение, которое можно использовать повторно.

Обновление: я хочу, чтобы это работало, чтобы я мог получить intellisense.Пожалуйста, посмотрите мимо тривиальности этого примера.Это коротко и точно, чтобы объяснить мою проблему.Если бы это была заявка на получение кредита 1003 (когда напечатан размер книги), я бы не хотел применять более 20 интерфейсов к своему классу, чтобы я мог сгруппировать связанные данные для расчетов.Я также не хотел бы каждый раз печатать все эти свойства.Отсутствие intellisense отвлекло меня от использования динамических языков в прошлом.(Я не ленивый, я эффективный!)

Ответы [ 4 ]

4 голосов
/ 08 октября 2011

Вы можете использовать Импровизированный интерфейс , чтобы сделать это.

3 голосов
/ 08 октября 2011

Если вы действительно хотите использовать динамический, то почему конвертация?

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

Но я все равно предпочел бы, чтобы пациент реализовал IPerson. С точки зрения дизайна это будет иметь больше смысла, а безопасность типов означает, что любая ошибка будет обнаружена во время компиляции, а не во время выполнения.

0 голосов
/ 08 октября 2011

IPerson не требуется. Просто сделайте Display_Person так:

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

Пока person реализует эти свойства, все работает отлично.

0 голосов
/ 08 октября 2011

Нет!Я не думаю (без реализации IPatient), что это возможно.Вы должны реализовать IPatient интерфейс

class Patient : IPatient {}

или удалить кастинг.

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