문제

public static IList<T> LoadObjectListAll<T>()
{
    ISession session = CheckForExistingSession();
    var cfg = new NHibernate.Cfg.Configuration().Configure();
    var returnList = session.CreateCriteria(typeof(T));
    var list = returnList.List();
    var castList = list.Cast<typeof(T)>();
    return castList;
}

그래서 "list" 요소를 일반 IList로 캐스팅할 때 빌드 오류가 발생합니다....여기서 눈에 띄는 오류를 볼 수 있는 사람이 있나요?

도움이 되었습니까?

해결책

T 유형도 아니고 System.Type. T 유형 매개변수입니다. typeof(T) 유형을 반환합니다. T.그만큼 typeof 연산자는 객체에 작용하지 않고 다음을 반환합니다. Type 유형의 객체입니다. http://msdn.microsoft.com/en-us/library/58918ffs.aspx

@John이 귀하의 직접적인 질문에 답변하는 것이 정확합니다.그러나 NHibernate 코드는 약간 다릅니다.구성하면 안 됩니다. ISessionFactory ~ 후에 점점 ISession, 예를 들어.

public static T[] LoadObjectListAll()
{
    var session = GetNewSession();
    var criteria = session.CreateCriteria(typeof(T));
    var results = criteria.List<T>();
    return results.ToArray();        
}

다른 팁

제 생각에는

var castList = list.Cast<typeof(T)>();

해야한다

var castList = list.Cast<T>();

@jon limjap 내가 볼 수있는 가장 눈부신 오류는 IList 확실히 와는 다르다 IList<T>.안 IList 비 게 릭입니다 (예 : ArrayList).

원래 질문은 이미 IList<T>.누군가가 서식을 편집했을 때 제거되었습니다.아마도 Markdown의 문제일 것입니다.

지금 수정되었습니다.

IList는 IList<T>입니다. 그녀가 게시했을 때 마크다운으로 인해 문제가 발생했습니다.포맷하려고 했으나 <T>를 이스케이프 처리하지 못했습니다. 지금 수정 중입니다.

CLI는 대리자를 사용할 때 공분산 및 반공분산에 대한 일반 인수만 지원하지만 제네릭을 사용할 때는 몇 가지 제한 사항이 있습니다. 예를 들어 문자열을 객체에 캐스팅할 수 있으므로 대부분의 사람들은 List to a List를 사용하여 동일한 작업을 수행할 수 있다고 가정하지만 일반 매개변수 사이에는 공분산이 없기 때문에 그렇게 할 수 없습니다. 하지만 이 문서에서 볼 수 있듯이 공분산을 시뮬레이션할 수 있습니다.따라서 추상 팩토리에서 생성되는 런타임 유형에 따라 다릅니다.

마르코프 체인처럼 읽혀요...브라보.

T는 이미 유형 매개변수이므로 이에 대해 typeof를 호출할 필요가 없습니다.TypeOf는 유형을 취하고 해당 유형 매개변수를 반환합니다.

"원래 질문은 이미 IList<T>.누군가가 서식을 편집했을 때 제거되었습니다.아마도 Markdown에 문제가 있는 것 같습니다."

그것이 내가 본 것이지만 누군가에 의해 편집되었기 때문에 공분산에 대한 설명을 넣었지만 어떤 이유로 -1로 표시되었습니다.

혼란스러운 임시 변수가 너무 많습니다.

대신에

var returnList = session.CreateCriteria(typeof(T));
var list = returnList.List();
var castList = list.Cast<typeof(T)>();
return castList;

그냥 해

return session.CreateCriteria(typeof(T)).List().Cast<T>();

@조나단 홀랜드

T는 이미 유형 매개변수이므로 이에 대해 typeof를 호출할 필요가 없습니다.TypeOf는 유형을 취하고 해당 유형 매개변수를 반환합니다.

typeof 유형을 "취하여" 그 유형을 반환합니다. System.Type

CLI는 다음에 대한 일반 인수만 지원합니다. 공분산과 반공분산 대리자를 사용할 때는 하지만 제네릭을 사용할 때는 몇 가지 제한 사항이 있습니다. 예를 들어 문자열을 객체에 캐스팅할 수 있으므로 대부분의 사람들은 다음을 사용하여 동일한 작업을 수행할 수 있다고 가정합니다. List<string>List<object> 하지만 일반 매개변수 사이에는 공분산이 없기 때문에 그렇게 할 수 없습니다. 그러나 여기에서 볼 수 있듯이 공분산을 시뮬레이션할 수 있습니다. 기사.따라서 추상 팩토리에서 생성되는 런타임 유형에 따라 다릅니다.

@Jon과 @Jonathan은 정확하지만 반환 유형도 다음과 같이 변경해야 합니다.

IList<T>

또한.그것이 단지 마크다운 버그가 아니라면 말이다.

@홍옥, 그런 줄 알았습니다.

사용 중인 nHibernate 버전이 무엇인지 잘 모르겠습니다.아직 2.0의 골드 릴리스를 시도하지 않았지만 일부 줄을 제거하여 일부 방법을 정리할 수 있습니다.

public static IList<T> LoadObjectListAll()
{
    ISession session = CheckForExistingSession();
    // Not sure if you can configure a session after retrieving it.  CheckForExistingSession should have this logic.
    // var cfg = new NHibernate.Cfg.Configuration().Configure();
    var criteria = session.CreateCriteria(typeof(T));
    return criteria.List<T>();
}

내가 볼 수 있는 가장 눈에 띄는 오류는 IList 확실히 와는 다르다 IList<T>.안 IList 일반적이지 않습니다(예: ArrayList).

따라서 메소드 서명은 다음과 같아야 합니다.

public static IList<T> LoadObjectListAll()
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top