2016-07-22 3 views
2

Имея следующий код:Возврат функции делегата на основе типа

public delegate Task<bool> CreateObject<TU> 
     (TU obj, object parameters, Expression<Func<TU, object[]>> includes = null); 

// This Version compile 
public CreateObject<Dummy> Example1(Type listOfType) 
{ 
    CreateObject<Dummy> c = DummyRepository.InsertAsync; 
    return c; 
} 

// This Version do NOT compile  
public CreateObject<TU> Example2<TU>(Type listOfType) 
{ 
    if (listOfType == typeof(Dummy)) return DummyRepository.InsertAsync; 
    if (listOfType == typeof(DummyName)) return DummyNameRepository.InsertAsync; 
    if (listOfType == typeof(DummyEntry)) return DummyEntryRepository.InsertAsync; 
    return null; 
} 
// This Version do NOT compile  
public CreateObject<TU> Example3<TU>() 
{ 
    if (typeof(TU) == typeof(Dummy)) return DummyRepository.InsertAsync; 
    if (typeof(TU) == typeof(DummyName)) return DummyNameRepository.InsertAsync; 
    if (typeof(TU) == typeof(DummyEntry)) return DummyEntryRepository.InsertAsync; 
    return null; 
} 

Я пытаюсь вернуть метод (все доли подписи, основанной на Т), тем не менее, у меня возникли проблемы написания этого кода, кто-нибудь знает, как сделать это?

Раствор, мне нужно, должно быть основано на example2, где я использую тип listOfType, и по этой причине я хотел бы избежать вызова метода Whith родового ТУ ...

Update: # 1

if (listOfType == typeof(Dummy)) return (CreateObject<object>)(object)(CreateObject<Dummy>)DummyRepository.InsertAsync; 

Эта линия, компилируется, но не работает ...

Любые другие варианты? Какая у меня другая конструкция или решение?

+0

Версии, которые не компилируются, не создают делегатов ... Первый из них будет потому, что вы явно создаете делегат. –

+0

Вы не можете применять логику выполнения для генерических типов. – Ankur

+0

@ Ankur Да, я понимаю, но какое другое решение я должен реализовать для цели? – Dryadwoods

ответ

0

я нашел рабочий раствор:

public dynamic Example7(Type listOfType) 
{ 
    CreateObject<Dummy> a1 = DummyRepository.InsertAsync; 
    if (listOfType == typeof(Dummy)) return (CreateObject<Dummy>)DummyRepository.InsertAsync; 
    if (listOfType == typeof(DummyName)) return (CreateObject<DummyName>)DummyNameRepository.InsertAsync; 
    if (listOfType == typeof(DummyEntry)) return (CreateObject<DummyEntry>)DummyEntryRepository.InsertAsync; 
    return null; 
} 

Затем, в окне проводника решение, щелкните правой кнопкой мыши на ссылки, выберите команду Добавить ссылку, перейдите на вкладку .NET, найти и добавить Microsoft.CSharp.

«потребительский класс» будет иметь что-то вроде:

var rep = uow.Example7(listOfType); 
foreach (var t in list as dynamic) 
{ 
    ..... 
    var res = await rep(t, null, null); 

И это работает .... Я до сих пор не сделал каких-либо тестов производительности/скорости, но, по крайней мере, код делает то, что я был ищет .....

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