2016-01-12 5 views
4

У меня есть эта обобщенная функция:Преобразовать TypeOf (Т) Т

public List<T> GetList<T>() { 
    var businesType = typeof(T); 
    var databaseType = AutoMapperConfiguration.TypeMapping[businesType]; 

    var databaseEntityList = DataModelAccess.GetEntityList(databaseType); 

    var businessEntityList = Mapper.Map(databaseEntityList, databaseEntityList.GetType(), typeof(List<T>)); 
    return (List<T>)businessEntityList; 

} 

Но то, что я хочу, вместо того, чтобы позвонить DataModelAccess так:

DataModelAccess.GetEntityList(databaseType); 

должен отправить databaseType в качестве родового типа, как то:

DataModelAccess.GetEntityList<DatabaseType>(); 

, чтобы иметь возвращение этого метода как List<T>.

Спасибо! P.S. Определение DataModelAccess.GetEntityList (databaseType) является:

public static List<object> GetEntityList(Type databaseType) 
{ 
    //get data from database 
    //retunt it as List<object> <= and I dont like that 
} 
+4

Пожалуйста, показать нам код/​​определение 'DataModelAccess.GetEntityList()' –

+0

Зачем вам это нужно? Просто не нравится подпись с типом в качестве параметра? Это не одна линия для достижения цели и, возможно, не стоит ничего стоит – sll

+0

Я хочу это, чтобы быть легко используемым другими программистами (это будет библиотека). Спасибо! –

ответ

2

функция очень похожа на ваш GetList<T> должен решить этот вопрос для вас.

public List<T> GetEntityList<T>() { } 

Вы можете вызвать его

typeof(DataModelAccess) 
    .GetMethod("GetEntityList") 
    .MakeGenericMethod(databaseType) 
    .Invoke(); 

Надеется, что это помогает.

+0

ну, я не думаю, что в этом случае требуется отражение. У него уже есть 'T' для работы с – frikinside

+1

Да, но он определяет T (databaseType) во время выполнения, поэтому требуется отражение. – jvanrhyn

+0

О! Вы правы, я забыл это! Виноват! 'T' не соответствует типу – frikinside

2

Если ваш метод GetEntityList возвращает общий List<object>, но все его элементы одного типа, вы можете использовать IEnumerable.Cast<T>, чтобы превратить его в List<T>:

List<object> result = DataModelAccess.GetEntityList(databaseType); 
List<T> databaseEntityList = result.Cast<T>().ToList(); 

Кроме этого, нет, вы не можете назвать не -генерический метод в общем случае без изменения этого метода.

+0

hm, я постараюсь использовать это. Спасибо! –