2014-12-19 3 views
0

У меня есть несколько проектов в моем решении MVC. В моем веб-проекте ImageController имеет обновление, удаление и создание методов для всех классов Image в моем проекте. На данный момент я использую опции переключателя для доступа к соответствующим службам из уровня сервиса (другой проект библиотеки классов).Динамический выбор класса сервиса на основе значения переменной

namespace MySolution.Web.Controllers 
{ 
    public class ImageController : Controller 
    { 
     public void UpdateMainImage(string imageClassName, string name, long id) 
     { 
      using (ServiceFactory factory = new ServiceFactory()) 
      { 
       switch (imageClassName) 
       { 
        case "CategoryImage": factory.CategoryImage.UpdateDisplayImage(name, id); 
         break; 
        case "ItemImage": factory.ItemImage..UpdateDisplayImage(name, id)); 
         break; 
        //other case statements             
       } 
     } 

// Delete Image Method 
public void DeleteImage(string imageClassName, long id) 
     { 
      using (ServiceFactory factory = new ServiceFactory()) 
      { 
       switch (imageClassName) 
       { 
        case "CategoryImage": factory.CategoryImage.DeleteImage(id); 
         break; 
        case "ItemImage": factory.ItemImage..DeleteImage(id)); 
         break; 
        //other case statements             
       } 
     } 
    } 

Могу ли я выбрать соответствующий класс класса «Сервис» динамически? Переменная imageClassName содержит имя класса сервиса Image.

factory.imageClassName.DeleteImage(name, id); 

Есть ли способ использовать строковую переменную для замены имени класса?

+0

'Отражение' может это сделать, но оно медленное и сложное. Я предлагаю вам использовать оператор switch. – opewix

+0

@JesseJames спасибо за быстрый ответ. Да, я видел несколько ответов и сообщений с помощью Reflection. http://stackoverflow.com/questions/1044455/c-sharp-reflection-how-to-get-class-reference-from-string Хотя мне нужно писать больше кодов, лучше использовать оператор switch, если есть нет другого лучшего решения. – user3627847

ответ

0

Являются ли ваши классы (CategoryImage, ItemImage и т. Д.) Унаследованными от единого интерфейса или абстрактного класса?

Вы можете использовать Dictionary<string, ImageService в этом случае, где ImageService - базовый класс или интерфейс.

private static IDictionary<string, ImageService> imageServices = new Dictionary<string, ImageService> 
{ 
    { "CreateImage", new CreateImage() }, 
    { "ItemImage", new ItemImage() }, 
}; 

// somewhere below: 
imageServices[imageClassName].UpdateDisplayImage(name, id); 
Смежные вопросы