방법 확장을 위해 작동하지 않는 인터페이스
-
01-07-2019 - |
문제
에서 영감을 MVC storefront 최신 프로젝트에서 일하고 있어요 사용하고 확장에서 방법을 진행하고 결과를 필터링합니다.
이 인터페이스;
IPrimaryKey
{
int ID { get; }
}
고 내가 이 연장 방법
public static IPrimaryKey GetByID(this IQueryable<IPrimaryKey> source, int id)
{
return source(obj => obj.ID == id);
}
가 하나의 클래스,SimpleObj 를 구현하는 IPrimaryKey.있을 때 진행하고 있습니다.의 SimpleObj 의 GetByID 방법이 없지 않는 한 나는 explicitally 캐스팅으로 진행하고 있습니다.의 IPrimaryKey 것보다 적은 이상적입니다.
나는 뭔가요?
해결책
그것은 작품을 할 때,바로 이루어집니다.cfeduke 의 솔루션을 작동합니다.그러나,당신은 없을 만들기 IPrimaryKey
인터페이스는 일반적인 사실,당신을 변경할 필요가 없는 너의 원래의 정의에서 모:
public static IPrimaryKey GetByID<T>(this IQueryable<T> source, int id) where T : IPrimaryKey
{
return source(obj => obj.ID == id);
}
다른 팁
편집: Konrad의 솔루션은 더 나은 때문에 훨씬 더 간단합니다.아래 솔루션을 작동하지만 필요한 상황에서 비슷한 ObjectDataSource 는 방법의 클래스를 통해 검색 반사지 않고 걷는 상속의 계층 구조입니다.분명히 아무 일도 안 일어납니다 여기에.
이것이 가능했을 구현하는 유사한 패턴을 디자인할 때 사용자 정의 엔티티 프레임 워크를 위한 솔루션으로 작업 ObjectDataSource:
public interface IPrimaryKey<T> where T : IPrimaryKey<T>
{
int Id { get; }
}
public static class IPrimaryKeyTExtension
{
public static IPrimaryKey<T> GetById<T>(this IQueryable<T> source, int id) where T : IPrimaryKey<T>
{
return source.Where(pk => pk.Id == id).SingleOrDefault();
}
}
public class Person : IPrimaryKey<Person>
{
public int Id { get; set; }
}
조각의 사용:
var people = new List<Person>
{
new Person { Id = 1 },
new Person { Id = 2 },
new Person { Id = 3 }
};
var personOne = people.AsQueryable().GetById(1);
이 작업할 수 없는 사실로 인해 제네릭이 없는 능력에 따라 상속 패턴이 있습니다.ie.진행<SimpleObj> 지 않는 상속에 나무의 진행<IPrimaryKey>
제휴하지 않습니다 StackOverflow