Как использовать выражение с универсальным - PullRequest
1 голос
/ 15 июля 2011

Вот класс

public class Repository<T>
{
  T GetSingle(Expression<Func<T, bool>> condition);
}

А затем в другом классе, который принимает аргумент универсального типа, у меня есть что-то вроде:

repo = new Repository<TEntity>();
repo.GetSingle(x=> x.Id == 1); 
// That won't compile because TEntity is a generic type. 
//Compiler doesn't know if TEntity has Id or not. 

Итак, как передать это выражение?

UPD: создание класса ограничения типа представляется разумным решением.Но, к сожалению, не работает для меня.TEntity в моем случае - это EntityObject Entity Framework.Даже если я попытаюсь создать класс ограничений и вывести его из EntityObject или StructuralObject, компилятор скажет: неявного преобразования ссылок не существует

Ответы [ 3 ]

3 голосов
/ 15 июля 2011

Объявление "другого класса" с ограничением типа в TEntity, например:

class AnotherClass<TEntity> where TEntity : ISomethingWithId

, где ISomethingWithId может быть

interface ISomethingWithId {
   int Id {get;}
}

Тогда это должно работать ...

2 голосов
/ 15 июля 2011

Если TEntity является универсальным типом, но вы знаете, что любой переданный класс будет иметь свойство Id, вы можете добавить ограничение типа на универсальный класс.

public interface IEntity
{
    int Id;
}

public class Entity : IEntity
{
    public int Id;
}

public class Test<TEntity> where TEntity : Entity // generic type constraint
{
    private void test()
    {
        var repo = new Repository<TEntity>();
        repo.GetSingle(x => x.Id == 1);
    }
}
2 голосов
/ 15 июля 2011

Определите интерфейс IEntity как

public interface IEntity 
{
    long Id{get; set;}
}

, а затем измените определение класса репозитория на

public class Repository<T> : where T:IEntity
{
     T GetSingle(Expression<Func<T, bool>> condition); 
}

Конечно, убедитесь, что TEntity реализует IEntity интерфейс, и теперь ваш код будет компилироваться и работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...