У меня определены следующие интерфейсы:
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
сверху), я хотел бы иметь возможность создать экземпляр 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
Я уверен, что это шаблон дизайна, который был у многих прежде, но я не могу обойти его.Буду очень признателен, если кто-нибудь покажет мне, как этого достичь.