데이터 액세스 계층에 다음과 같은 클래스 구조가 있다고 가정 해 보겠습니다.유형 변형을 허용하지 않는 ref 매개 변수를 어떻게 얻을 수 있습니까?
interface IBehavior<in T>
{
void Load(T model);
}
class ModelManager<T>
{
ModelManager(IEnumerable<IBehavior<T>> behaviors) { ... }
void Load(T model)
{
foreach (var behavior in behaviors) {
behavior.Load(model)
}
}
}
이것은 내 모델에서 구현할 수있는 다양한 인터페이스와 이러한 인터페이스를 처리하는 재사용 가능한 동작을 제공합니다.
interface IUnique { ... }
class UniqueBehavior : IBehavior<IUnique> { ... }
interface ITimestampable { ... }
class TimestampableBehavior : IBehavior<ITimestampable> { ... }
그리고 관리자는 IBehavior<T>
의 반공 변이 때문에 기꺼이 이러한 조치를 취할 것입니다.
class MyModel : IUnique, ITimestampable { ... }
new ModelManager<MyModel>(new IBehavior<MyModel>[] {
new UniqueBehavior(),
new TimestampableBehavior()
});
Super.
하지만 이제는 각 동작이 엔티티에 LINQ 필터 집합을 적용하도록하고 싶습니다. 내 첫 번째 아이디어는이 메서드를 IBehavior<T>
에 추가하는 것이 었습니다.
void ApplyFilters<IEnumerable>(ref IEnumerable<T> models)
... 구현 동작으로 Where
절을 열거 형에 적용 할 수 있습니다.
하지만, ref parameters don't allow type variation로 밝혀졌습니다. 유형 안전성과 인터페이스의 반작용 성을 유지하면서 이러한 종류의 기능을 구현하는 방법을 찾기 위해 고심하고 있습니다. 어떤 아이디어라도 감사합니다.
'ApplyFilters'가 'IEnumerable ApplyFilters (IEnumerable 모델)' –
Gabe
서명을 가질 것으로 예상됩니다. T도 반환 유형이됩니다. 두 가지 모두 시도한 것을 기억하며, ref를 사용하여 사용하는 경우에 더 의미가 있습니다. 이렇게하면 비헤이비어가 필터를 적용하지 않으려는 경우 비워 둘 수 있습니다. –