2013-06-25 37 views
0

所以我有這種方法返回一個泛型類型;該方法是該接口所要求的。泛型類型TOutput被限制爲List。儘管我的返回值是一個List,但它仍然不能編譯。錯誤僅在返回語句中(無法轉換爲TOuput)。有任何想法嗎?儘管有約束,返回語句不滿足泛型返回類型嗎?

public class QueryCollectionDataSourceBase<TInput, TOutputType, TOutput> : IQueryCollectionDataSource<TInput, TOutputType, TOutput> 
    where TOutput : List<TOutputType> 
{ 
    public virtual Func<TInput, SqlParameter[]> ParameterAdapter { get; private set; } 
    public virtual Func<IDataRecord, TOutputType> ObjectAdapter { get; private set; } 

    protected QueryCollectionDataSourceBase(Func<TInput, SqlParameter[]> parameterAdapter, 
            Func<IDataRecord, TOutputType> objectAdapter) 
    { 
     ParameterAdapter = parameterAdapter;  
     ObjectAdapter = objectAdapter; 
    } 

    public TOutput Execute(TInput request) 
    { 
     using (var rdr = SqlHelper.ExecuteReader(
      DatabaseConnection.ConnectionString, 
      CommandType.StoredProcedure, 
      "dbo.usp_ws_act_UserByAccountIDGet", 
      ParameterAdapter(request))) 
     { 
      var result = new List<TOutputType>(); 
      while (rdr.Read()) 
      { 
       result.Add(ObjectAdapter(rdr)); 
      } 
      return result; 
     } 
    } 
} 

public interface IQueryCollectionDataSource<in TRequest, out TListType, out TOutput> : IQueryDataSource<TRequest, TOutput> 
    where TOutput : List<TListType> 
{ 
    Func<IDataRecord, TListType> ObjectAdapter { get; } 
} 
+0

爲什麼'TOutput'應該是它自己的類?你希望有'List '的_subclasses_嗎?是否可以更改簽名以完全轉儲'TOutput',並且只需要返回一個'IEnumerable '? –

+0

我其實已經嘗試過IEnumerable,原來的結果相同 – Sinaesthetic

回答

0

Execute應該返回一個TOutput而是它返回TOutputTypeList。 A TOutput被限制爲List<TOutputType>,但List<TOutputType>不限於TOutput

嘗試實例result爲:

var result = new TOutput(); 

,並看到如何繼續下去。

+0

我認爲你的診斷是正確的。但問題在於'TOutput'沒有用'new()'約束來定義,所以你不能以這種方式實例化它。 (要麼使用反射,要麼稍微改變設計) –

+0

是的,你是對的。有一個潛在的設計問題。 – catfood