2010-01-02 1 views
27

다양한 데이터베이스 테이블에는 속성과 값 열이 있습니다. Linq를 사용하여 데이터베이스에 액세스합니다.왜 C# 제네릭 메서드에서 "오류 : ... 참조 형식이어야합니다"가 표시됩니까?

나는 주어진 데이터베이스 테이블에서 검색 속성/값이 포함 된 사전을 반환하는 방법을 쓰고 있어요 : 컴파일시

private static Dictionary<string, string> GetProperties<T>(Table<T> table) 
{ 
    Dictionary<string, string> properties = new Dictionary<string, string>(); 

    foreach (var row in table) 
    { 
     properties[row.Property]=row.Value; 
    } 

    return properties; 
} 

를, 내가 얻을 : 내가 해봤

Error 1 The type 'T' must be a reference type in order to use it as parameter 'TEntity' in the generic type or method 'System.Data.Linq.Table<TEntity>'

운이없이이 오류 메시지를 검색합니다.

StackOverflow를 검색하면 매개 변수 List : Generic List<T> as parameter on method과 관련하여이 질문은 유사하지만이 매개 변수는 여전히 해당 질문에 대한 응답의 참조 형식이 아닙니다.

MSDN의 C# 프로그래밍 가이드 읽기 : http://msdn.microsoft.com/en-us/library/twcad0zb(VS.80).aspx 예제는 모두 참조로 매개 변수를 전달합니다. 그러나 제네릭 형식은 단지 제네릭 형식의 테이블을 지정하기위한 것이므로 내 특정 사례에서 참조로 전달하는 방법을 볼 수 없습니다.

모든 포인터가 많이 감사하겠습니다.

추신 : 답변을 수락하는 데 시간이 걸리면이 기능에 현재 액세스 할 수 없기 때문에 사과드립니다 (나는 눈이 멀고 스크린 리더를 사용합니다).

+0

어느 라인에 대한 해당 오류 메시지가 무엇입니까? – sblom

+4

@Mahesh : 그의 직책의 마지막 줄을 읽었습니까? @Saqib : 그것에 대해 StackOverflow 사람들에게 메모를 보내고 싶을 수도 있습니다. 사이트의 중요한 기능이 손상되어 방문자의 상당 부분이 작동하지 않는다는 사실을 알고 싶어합니다. –

+1

미안하지만, 나하지 않았다. 지적 해 주셔서 고마워요. 사과 –

답변

59

이는 Table<T> 선언 방법의 발생 : 당신의 방법은 T에 아무런 제약이 없기 때문에 컴파일러는 당신의 사양을 준수하지 않는 T을 받아 들일 수 있다는 것을 의미한다, 불평

public sealed class Table<TEntity> : IQueryable<TEntity>, 
    IQueryProvider, IEnumerable<TEntity>, ITable, IQueryable, IEnumerable, 
    IListSource 
where TEntity : class // <-- T must be a reference type! 

Table<T>.

따라서 사용자의 방법은 최소한 허용하는 것에 대해 엄격해야합니다. 이 대신에보십시오 :

private static Dictionary<string, string> GetProperties<T>(Table<T> table) where T : class 
21

메서드 선언에 where T : class이라는 제약 조건을 추가하기 만하면됩니다.

Table<TEntity>에는 where TEntity : class 제약이 있으므로이 작업이 필요합니다. 그렇지 않으면 일반 메서드가 struct 형식 매개 변수를 사용하여 호출 될 수 있습니다.이 경우에는 Table<TEntity>의 제약 조건을 위반하는 해당 struct 형식 매개 변수를 사용하여 Table<TEntity>을 인스턴스화해야합니다.

0
public class TEntityRepository<TEntity> : EFRepository<TEntity> , ITEntityRepository<TEntity> 
    where TEntity : class, new() 
{ 
} 
관련 문제