2013-12-12 2 views
0

Рассмотрим этот DAL как код:избавление от аргумента общего типа: возможно ли это?

mDealerTypes = Read<Dictionary<string, DealerType>, DealerType>(
() => { return DALFactory.Instance.ReadDealerTypes(cn); }, 
(c, o) => c.Add(o.DealerTypeKey, o)); 

mCountries = Read<Dictionary<string, Country>, Country>(
() => { return DALFactory.Instance.ReadDealerTypes(cn); }, 
(c, o) => c.Add(o.Code, o)); 

     private C Read<C, T>(Func<SqlConnection, IDataReader> func, Action<C, T> a) 
      where C : ICollection, new() 
      where T : EntityBase, new() 
     { 
      C objects = new C(); 

      using (IDataReader reader = func(connection)) 
      { 
       while (reader.Read()) 
       { 
        T obj = new T(); 
        obj.Init(reader); 
        a(objects, obj); 
       } 
      } 

      return objects; 
     } 

Для удобства чтения, я хотел бы, чтобы как-то изменить это так объект, который хранится в коллекции не повторяется дважды в списке аргументов типа Рида <>.

mCountries = Read<Dictionary<string, Country>>(
() => { return DALFactory.Instance.ReadDealerTypes(cn); }, 
(c, o) => c.Add(o.Code, o)); 

но как переписать Читать <> затем? Возможно ли это?

частный ?? Read (Func FUNC, Action а)

+0

Лично я бы найти его более удобный для чтения, чтобы всегда возвращать плоское перечисление или сбор от метода Dal , тогда вызывающий абонент построит словарь, в вашем случае, вызвав .ToDictionary (o => o.DealerTypeKey). – Joe

ответ

1

Создание простого метода обертки (или метод расширения)

public Dictionary<T1, T2> ReadEx<T1, T2>(...) where T2 : EntityBase 
{ 
    return Read<Dictionary<T1, T2>, T2>(...) 
} 
+0

Получил работу с T2: новый() добавлен. спасибо – Laurijssen

Смежные вопросы