Самый простой способ - добавить ограничение на ваш общий интерфейс:
public interface IInjectator
where T : InjectableClass
{ }
Таким образом .net не позволит вам получить недопустимый тип.
Если вы не можете этого сделать, нет простого способа изменить поведение RegisterGeneric
, как я могу видеть, это подписаться на событие OnActivated
и выбросить исключение:
builder.RegisterGeneric(typeof(Foo<>))
.As(typeof(IFoo<>))
.OnActivated(e =>
{
Boolean isValid = e.Component.Services
.OfType()
.Where(s => s.ServiceType.IsConstructedGenericType
&& s.ServiceType.GetGenericTypeDefinition() == typeof(IFoo<>)
&& s.ServiceType.GetGenericArguments()[0].IsAssignableTo())
.Any();
if (!isValid)
{
throw new Exception("boom");
}
});
Если вы не хотите генерировать исключение, вы можете реализовать свой собственный IRegistrationSource
. Вы можете посмотреть исходный код нативного OpenGenericRegistrationSource
, который разрешает открытые общие типы.
Структуры не могут быть разрушены в Swift.
Ваш кортеж, point = (3, 2)
, относится к типу (Int, Int)
, что является частью того, почему вы можете его деструктурировать.
Тип вашей структуры, S
, просто S
. Его переменные, a
и b
, не включены в его тип так же буквально, как и для кортежа. Структура - это просто совершенно другой тип объекта, и такого поведения для него не существует.
Это не существует как таковое в языке.
Одним из вариантов является вычисляемое вспомогательное свойство:
struct S {
let i: Int
let b: Bool
}
extension S {
var destructured: (Int, Bool) {
return (self.i, self.b)
}
}
let s = S(i: 10, b: false)
let (i, b) = s.destructured
Конечно, вы должны вручную синхронизировать его. Возможно, Sourcery мог бы помочь с этим.