Репозиторий C # с использованием Generics - PullRequest
2 голосов
/ 13 октября 2010

У меня есть следующий репозиторий, который я использую для модульного тестирования:

public class MyTestRepository<T>
{
    private List<T> entities = new List<T>();

    public IQueryable<T> Entities
    {
        get { return entities.AsQueryable(); }
    }

    public T New()
    {
        //return what here???
    }

    public void Create(T entity)
    {
        entities.Add(entity);
    }

    public void Delete(T entity)
    {
        entities.Remove(entity);
    }
}

Что я возвращаю в методе New ()?

Я пробовал это:

    public T New()
    {
        return (T) new Object();
    }

Но это дает мне следующее исключение при запуске модульного теста:

System.InvalidCastException: Unable to cast object of type 'System.Object' to type 'MyCustomDomainType'.

Есть идеи о том, как реализовать метод New ()?

Ответы [ 4 ]

10 голосов
/ 13 октября 2010

Вы можете добавить ограничение для параметра типа T:

public class MyTestRepository<T> where T : new() 

и return new T(); в методе.

2 голосов
/ 13 октября 2010

Вы должны изменить определение своего репозитория, добавив ограничение new (), например:

public class MyTestRepository<T> where T : new()
{
    ...
}

Это ограничивает типы, которые могут использоваться с MyTestRepository, к тем, которые имеют конструктор по умолчанию.Теперь в вашем методе New () вы можете сделать:

public T New()
{
    return new T();
}
1 голос
/ 13 октября 2010

Это не сработает, так как вы просто создаете объект, ничего больше.Как насчет создания объекта с помощью Activator:

return (T)Activator.CreateInstance(typeof(T));

См .: http://msdn.microsoft.com/en-us/library/system.activator.aspx

1 голос
/ 13 октября 2010

Предполагая, что тип T имеет конструктор public / default, разве это не исправит исключение?

public T New()
{
    return new T();
}
...