2014-01-10 3 views
0

Я умираю здесь, пытаясь реализовать общий репозиторий с моей единицей работы. Это будет хорошо работать с конкретным проектом, над которым я работаю. Но я просто не могу понять правильный синтаксис. Если бы я мог получить только ниже, чтобы работать в качестве отправной точки ...Создайте универсальный репозиторий неизвестного типа во время выполнения

Я хотел бы быть в состоянии сделать

unit_of_work.Repository<don't-know-until-runtime>().Insert(run-time-object); 

, где я не буду знать, пока во время выполнения какой-то объект I будет иметь дело, я знаю только, что это будет тип «BaseClass».

Очень ценю вашу помощь. Я попытался свернуть код внизу.

public class BaseClass 
{ 
} 

public class SubClass1 : BaseClass 
{ 
    public SubClass1() 
     : base() 
    { 
    } 
} 

public interface IRepository<TEntity> where TEntity : class 
{ 
    void Insert(TEntity entity); 
} 


public class Repository<TEntity> : IRepository<TEntity> where TEntity : class 
{ 
    public void Insert(TEntity entity) 
    { 
     System.Diagnostics.Debug.WriteLine("got here!!"); 
    } 
} 

public class UnitOfWork 
{ 
    public virtual IRepository<TEntity> Repository<TEntity>() where TEntity : class 
    { 
     var type = typeof(TEntity).Name; 
     var repositoryType = typeof(Repository<>); 

     return (IRepository<TEntity>) Activator.CreateInstance(repositoryType.MakeGenericType(typeof(TEntity))); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     UnitOfWork unit_of_work = new UnitOfWork(); 

     SubClass1 testClass1 = new SubClass1(); 

     // this works fine, when I know the type in advance... 
     unit_of_work.Repository<SubClass1>().Insert(testClass1); 

     // ... but when I don't know the type, then what? 
     // (All I know is that the incoming object will be of type BaseClass) 
    } 
} 
+1

это C++? можете ли вы пометить вопрос языком? – Bohemian

+0

@Bohemian Я могу и у меня есть, спасибо. –

+0

Я * обычно * обнаруживаю, что когда кто-то идет «Я не буду знать тип здесь», тогда в дизайне есть что-то еще, что неправильно. Заметьте, я сказал ** обычно **. –

ответ

0

Просто объявить хранилище и метод UOW с необходимым ограничением по типу для BaseClass:

public interface IRepository<TEntity> where TEntity : BaseClass 
... 
public class Repository<TEntity> : IRepository<TEntity> where TEntity : BaseClass 
... 
public virtual IRepository<TEntity> Repository<TEntity>() where TEntity : BaseClass 

, а затем вы можете сделать это:

unit_of_work.Repository<BaseClass>().Insert(<whatever>); 

Это работает из-за родовую контрвариацию.

+0

Это отлично работает - спасибо. Только одно: допустим, мне нужен TEntity FindById (object id) -метод в моем репозитории - как создать репозиторий, если мне нужно найти объект SubClass1, но будет знать только это во время выполнения? Если, например, объект SubClass1 получил любезность метода FindObject (BaseClass objectToFind). –

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