В Subsonic 2.1 как сделать так, чтобы этот общий вызов принимал один общий параметр? - PullRequest
0 голосов
/ 16 ноября 2011

Использование Subsonic 2.1 Я хочу, чтобы мой вызов метода для результатов выглядел следующим образом: results(searchCriteria) прямо сейчас я должен передать CollectionType, а также тип.

Animal searchCriteria = GetSearchCritera();
AnimalCollection results = results<Animal, AnimalCollection>(searchCriteria);
// I want the call to be results(searchCriteria);

Вот метод результатовчто я хочу просто взять Y

public static T results<Y, T>(Y searchCriteria)
    where Y: ReadOnlyRecord<Y>, new()
    where T:  ReadOnlyList<Y, T>, new()
{
    using (IDataReader results = ReadOnlyRecord<Y>.Find(searchCriteria))
    {
        T a = new  T();
        a.Load(results);
        return a;
    }
}

1 Ответ

1 голос
/ 16 ноября 2011

Я сделал этот класс:

    public class ConcreteList<T> : ReadOnlyList<T, ConcreteList<T>> where T: ReadOnlyRecord<T>, new()
    {
        public ConcreteList() { }
    }

изменил этот код:

    public static ConcreteList<T> results2<T>(T searchCriteria)
        where T : ReadOnlyRecord<T>, new()
    {
        using (IDataReader results = ReadOnlyRecord<T>.Find(searchCriteria))
        {
            ConcreteList<T> a = new ConcreteList<T>();
            a.Load(results);
            return a;
        }
    }

и я могу назвать это так:

    Animal searchCriteria = GetSearchCritera();
    ConcreteList<Animal> results = results2(searchCriteria);

О да, я хотел, чтобы это был метод расширения:

public static class ReadOnlyRecordExtensions
{
    public static ConcreteList<T> ExecuteFind<T>(this T searchCriteria)
            where T : ReadOnlyRecord<T>, new()
    {
        using (IDataReader results = ReadOnlyRecord<T>.Find(searchCriteria))
        {
            ConcreteList<T> list = new ConcreteList<T>();
            list.Load(results);
            return list;
        }
    }
}
...