2014-10-31 4 views
2

Конструкция действий является общей, но может ли поддерживать общий тип внутри него?Общий тип внутри действия?

Ниже приведен фрагмент кода, который я пытаюсь достичь.

Я знаю, что есть другие способы сделать это, но мне любопытно, может ли это быть достигнуто в конструкции Action.

void SomeMethod() 
{ 
    Action<int> Initialize = //<T> and where T is all that stuff 
    (index) => 
    { 
     T obj = new T(); 
     obj.Initialize(index); 
     obj.DoWork(); 
    }; 

    Initialize<TypeA>(1); 
    Initialize<TypeB>(2); 
} 

ответ

5

Нет, в основном - или, по крайней мере, не в одном экземпляре Action - один экземпляр неотъемлемо закрыт с точки зрения дженериков. Очевидно, вы можете использовать обычный общий метод Initialize<T>. Если нужно один Action, то, возможно, потребуется принять тип в качестве параметра:

Action<Type, int> init = (type, index) => { 
    ISomeInterface obj = (ISomeInterface)Activator.CreateInstance(type); 
    obj.Initialize(); 
    obj.DoWork(); 
}; 
init(typeof(TypeA), 1); 
init(typeof(TypeB), 2); 

В противном случае:

void Initialize<T>(int index) where T : new(), ISomeInterface { 
    T obj = new T(); 
    obj.Initialize(); 
    obj.DoWork(); 
} 
void SomeMethod() { 
    Initialize<TypeA>(1); 
    Initialize<TypeB>(2); 
} 

Вы можете создать Action<int> делегатов представлять отдельноInitialize<TypeA>(int) и Initialize<TypeB>(int) , но не оба одновременно, а не открытые Initialize<T>(int).

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