2015-08-22 2 views
0

Я хочу вызвать метод Create из любой программы, чтобы соответствовать тому, какой тип класса передается на основе во время выполнения операции.Как разрешить настраиваемый тип при передаче объекта в качестве аргумента

Так что проблема заключается в том, как разрешить анонимный тип при передаче частным методам?

Я звоню из:

_productService.Create<Supplier>(_supplier); 

Для моего метода класса:

public class ProductService 
{ 
    public void Create<T>(T obj) 
    { 
     switch (obj.GetType().Name) 
     { 
      case "Supplier": 
       Supplier(); //Call Supplier Method; 
       break; 
      case "Product": 
       Product(); //Call Supplier Method; 
       break; 
      default: 
       break; 
     } 
    } 

    private void Supplier<T>(T s) 
    { 
     //statements 
    } 

    private void Product() 
    { 
     //statements 
    } 
} 
+0

Если вы используете кожух переключателя с твердыми закодированными строками в соответствии с типом объекта, то вся идея Дженерики не имеет смысла Вот. Это может быть легко реорганизовано с некоторыми из хорошо известных шаблонов проектирования. Пожалуйста, не спрашивайте меня, каковы эти шаблоны дизайна :-) взгляните на dofactory.com – Thangadurai

ответ

0

Что о смене класса на что-то вроде:

public class ProductService 
{ 
    public void Create<T>(T obj) 
    { 
     if (typeof(Supplier) == typeof(T)) 
      Supplier(obj); //Call Supplier Method; 
     else if (typeof(Product) == typeof(Product)) 
      Product(); //Call Product Method; 
     else 
      throw new ArgumentOutOfRangeException("Unrecognized type", "type"); 
    } 

    private void Supplier<T>(T s) 
    { 
     //statements 
     Console.WriteLine("Supplier"); 
    } 
    private void Product() 
    { 
     //statements 
     Console.WriteLine("Product"); 
    } 
} 
0

Это выглядит как менее идеальный вариант использования для дженериков. Вместо этого вы рассмотрели возможность использования простых перегрузок методов. Попробуйте следующее:

public class Program 
{ 
    public static void Main() 
    { 
     Console.WriteLine("Hello World"); 
     var service = new ProductService(); 
     service.Create(new Product()); 
     service.Create(new Supplier()); 
     service.Create(new {name="test"}); 
    } 
} 


public class ProductService 
{ 
    public void Create(Product obj) 
    { 
     Product(); 
    } 
    public void Create(Supplier obj) 
    { 
     Supplier(); 
    } 
    public void Create(Object obj) 
    { 
     Console.WriteLine("Unknown type called" + obj.GetType().Name); 
    } 

    private void Supplier() 
    { 
     Console.WriteLine("Supplier called"); 
    } 
    private void Product() 
    { 
     Console.WriteLine("Product called"); 
    } 
} 
public class Product {} 
public class Supplier {} 

Вот dotnetfiddle для выше: https://dotnetfiddle.net/lzaAba

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