2011-09-23 4 views
1

Key를 개체 유형으로 사용하여 사전에 함수를 저장하려고합니다. 모든 함수는 동일한 기본 클래스에서 파생 된 객체를받습니다. 등록 된 함수를 기반으로 클래스를 DbCommand로 변환 할 수 있기를 원합니다. 내가 올바른 것 같아서 뭔가를 아래에 내 코드를 나열했습니다 있지만 뭔가 정말 구문이 누락 된 것 같아 등 잘못된 ... 모든 도움을 주시면 크게 감사하겠습니다!형식을 키로 사용하여 사전에 파생 형식 매개 변수가있는 함수

private Dictionary<object, Func<TrackingRecord, DbCommand>> conversionFunctions = new Dictionary<object, Func<TrackingRecord, DbCommand>>(); 


public void RegisterConversionFunction<T>(Func<T, DbCommand> conversionFunction) where T : TrackingRecord 
    { 
     conversionFunctions.Add(typeof(T), conversionFunction); 
    } 

public DbCommand GetConverstion<T>(T trackingRecord) where T : TrackingRecord 
    { 
     DbCommand command = null; 

     if (conversionFunctions.ContainsKey(trackingRecord.GetType())) 
     { 
      Func<T, DbCommand> conversionFunction; 
      if (conversionFunctions.TryGetValue(trackingRecord.GetType(), out conversionFunction)) 
      { 
       command = conversionFunction.Invoke(trackingRecord); 
      } 
     } 
     else 
     { 
      command = DefaultConversion(trackingRecord); 
     } 
     return command; 
    } 
+0

을 어떤 버전의 C# /. net입니까? –

+0

VS2010 .NET 4.0 – slocumro

+0

TrackingRecord는 사용자 지정 클래스입니다. – slocumro

답변

2

원래 솔루션의 문제점은 메소드 서명 Func<T, DbCommand>가 예상 값 Func<TrackingRecord, DbCommand> 일치하지 않습니다. 당신은 T는 TrackingRecord에서 상속 제한되는 것을 알고 있기 때문에,이 문제를 해결하려면, 당신은 예상 서명 (Func<TrackingRecord, DbCommand>를) 일치하는 포장 기능을 만들 수 있으며,이 시도

T.

에 인수 캐스트 :

private Dictionary<object, Func<TrackingRecord, DbCommand>> conversionFunctions = new Dictionary<object, Func<TrackingRecord, DbCommand>>(); 

public void RegisterConversionFunction<T>(Func<T, DbCommand> conversionFunction) where T : TrackingRecord 
{ 
    conversionFunctions.Add(typeof(T), tr => conversionFunction((T)tr)); 
} 

public DbCommand GetConverstion<T>(T trackingRecord) where T : TrackingRecord 
{ 
    DbCommand command = null; 
    Func<TrackingRecord, DbCommand> conversionFunction; 

    if (conversionFunctions.TryGetValue(typeof(T), out conversionFunction)) 
     command = conversionFunction.Invoke(trackingRecord); 
    else 
     command = DefaultConversion(trackingRecord); 

    return command; 
} 
+0

에 할당 할 수 없습니다. 그리고 설명을 분명히 해주셔서 감사합니다! – slocumro

+1

사전을 한 번만 확인하고 T를 사용하여 T의 하위 클래스가 해결할 수 없도록 "사전"캐스트가 아닌 강력한 캐스트를 사용하도록이 내용을 약간 정리했습니다. 오류가 더 분명합니다. –

관련 문제