У меня определены следующие интерфейсы:
public interface IAudit {
DateTime DateCreated { get; set; }
}
public interface IAuditable {
IAudit Audit { get; set; }
}
Интерфейс IAuditable
говорит, для каких классов у меня будет Audit
для. Интерфейс IAudit
является фактическим Audit
для этого класса. Например, у меня есть следующие реализации:
public class User : IAuditable {
public string UserName { get; set; }
public UserAudit Audit { get; set; }
}
public class UserAudit : IAudit {
public string UserName { get; set; }
public DateTime DateCreated { get; set; }
public UserAdit(User user) {
UserName = user.UserName;
}
}
Теперь, если объект, который является IAuditable
(User
сверху), я хотел бы иметь возможность создавать intance IAudit
(UserAdit сверху) путем подачи объекта IAuditable
в конструктор, В идеале у меня было бы что-то вроде:
if (myObject is IAuditable) {
var audit = new IAudit(myObject) { DateCreated = DateTime.UtcNow }; // This would create a UserAudit using the above example
}
Однако у меня есть куча проблем:
- Вы не можете создать экземпляр интерфейса
- Нет, где в коде он определяет, к какому
IAudit
относится к которомуIAuditable
- Я не могу указать, что интерфейс
IAudit
должен иметь конструктор, который принимаетIAuditable
Я уверен, что это шаблон дизайна, который у многих был раньше, но я не могу опустить его в голову. Я был бы очень признателен, если бы кто-нибудь мог показать мне, как это может быть достигнуто.