2011-01-06 3 views
1

데이터 액세스 계층에 다음과 같은 클래스 구조가 있다고 가정 해 보겠습니다.유형 변형을 허용하지 않는 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로 밝혀졌습니다. 유형 안전성과 인터페이스의 반작용 성을 유지하면서 이러한 종류의 기능을 구현하는 방법을 찾기 위해 고심하고 있습니다. 어떤 아이디어라도 감사합니다.

+1

'ApplyFilters'가 'IEnumerable ApplyFilters (IEnumerable 모델)' – Gabe

+0

서명을 가질 것으로 예상됩니다. T도 반환 유형이됩니다. 두 가지 모두 시도한 것을 기억하며, ref를 사용하여 사용하는 경우에 더 의미가 있습니다. 이렇게하면 비헤이비어가 필터를 적용하지 않으려는 경우 비워 둘 수 있습니다. –

답변

1

정확한 컨텍스트에서 작동할지는 확실하지 않지만 ApplyFolders를 자체적으로 일반화하려고 시도 했습니까?

void ApplyFolders<TEnum>(ref IEnumerable<TEnum> models) where TEnum : T; 
+0

그건 너무 미치 네요! 고마워, 나 혼자 생각하지 않았을거야. –

+0

.NET 4 일반 분산을 사용할 수 없을 때 사용하는 트릭입니다 – thecoop

+0

'ref' 매개 변수를 사용하지 않으실 것입니다. – Gabe

1

나는 Ptr class을 살펴볼 것입니다. 난이 한계를 완전히 극복하기 위해 최근에이 클래스를 이용 해왔다. .NET은 ref 키워드를 사용하여 CLR이 어떤 이유로 든 부작용을 일으킬 수 있다고 생각한다.

+0

그건 훌륭한 수업이지만 contravariance 문제를 다루지 않기 때문에이 경우에는 작동하지 않을 것입니다. 속성은 in/out이 될 것입니다. –

+0

'ref '에 대한 제한은 유형 안전성과 검증 가능성을 유지하기위한 것입니다; 'ref'는 실제 'outer'변수가 복사 된 것이 아니라 수정 된 것을 의미하며, 밑에있는 다른 스레드에 의해 인스턴스가 다른 것으로 변경되는 것을 원하지 않는다는 것을 명심하십시오. – thecoop

+0

@LLia와 PTR을 사용하는 @thecoop class ref 키워드를 사용하지 않고 기본 변수를 변경할 수있는 ref 사용법을 보겠습니다. 이 수업은 정말로 효과가 있습니다. 나는 이것을 사용하여 yield 반환 방법 내에서 ref 사용법을 사용합니다. yield return을 가진 메소드는 ref 변수를 사용할 수 없습니다. –