2011-08-14 2 views
0

나는이 오류 메시지와 관련하여 도움이 필요합니다. 기본적으로 C# .NET과 NHibernate를 사용하여 동적보고 클래스 라이브러리를 개발 중입니다."CitiesDomain.Cities"값은 "CitiesDomain.Cities"유형이 아니므로이 일반 콜렉션에서 사용할 수 없습니다. 매개 변수 이름 : 값

[Report(Guid="{D9DEB982-02A3-4700-868D-404E615F1DDA}", 
Title="Golf Course Report", 
Description= "Produces a list of golf courses by city")] 
[LookupParameter(ParamName="City", LookupTable="Cities", LabelName="Select a city")] 
[LookupTable(Table="Cities", IDColumn="CityID", ValueColumn="CityName")] 
public class GolfCourseReportByCity : Report { } 

는 웹 응용 프로그램이 최대를 시작할 때 :

보고서 자체는 사용자가 어떤 조회가 필요할 수 있습니다 테이블, 예를 포함한 메타 데이터가 필요로하는 매개 변수를 지정하는 속성을 사용하여 클래스를 통해 구현됩니다 \bin 폴더 내의 모든 어셈블리를 열거하고 Report 특성으로 꾸며진 클래스를 찾는 중 하나를로드합니다. LookupTable 특성을 만날 때 Reflection Emit을 사용하여 IDColumnValueColumn 특성 매개 변수로 지정된 속성으로 클래스를 만드는 새 어셈블리를 생성합니다. 또한, NHibernate .hbm.xml 매핑 파일은 동적으로 생성되고 NHibernate가 자신의 컨피규레이션에 그것을로드 할 수 있도록 어셈블리 내에 내장됩니다.

지금까지 내가 이걸 얻을 수 있었기 때문에 나는 이상한 문제로 내 길에서 멈추고있다.

Type generic = typeof(GolfScoreDAL.PersistenceManager<>); 
Type constructed = generic.MakeGenericType(EntityType); 
dynamic instance = Activator.CreateInstance(constructed); 
dynamic results = instance.FindAll(); 

이 코드 블록은

PersistenceManager<CitiesDomain.Cities> 
CitiesDomain.Cities 일반적인 매개 변수는 조립 열거 과정에서 설정 한 EntityType 속성에서 가져

과의 일반적인 DAL의 인스턴스를 생성한다 : 나는 다음과 같은 코드를 가지고있다 도메인 클래스 자체의 Type을 포함합니다. 불행하게도, 나는 다음과 같은 오류 메시지가 무엇입니까 위의 instance.FindAll() 라인을 호출 할 때 :

The value "CitiesDomain.Cities" is not of type "CitiesDomain.Cities" and cannot be used in this generic collection. Parameter name: value

이 오류는 아래의 코드에서 return results.List<T>(); 라인에서 생산되고있다 :

public IList<T> FindAll() 
    { 
     using (ISession session = OpenSession()) 
     { 
      var results = session.CreateCriteria(typeof(T)); 
      return results.List<T>(); // <------ falls over here 
     } 
    } 

그렇게하지를 일반 유형 TCreateCriteria 메소드에 의해 반환되는 결과의 유형과 일치하므로 (즉, 중간 창에서 다음을 입력하면이 사실이 입증됩니다) 이유를 이해하십시오. 작동하지 않는 몇 가지 이유 return results.List<T>();를 들어

 
? results.List()[0] is typeof(T) 
true 

하지만 return results.List();는 않습니다.

위의 Type constructed = generic.MakeGenericType(EntityType); 행을 프로젝트 내에서 참조되는 구체적인 도메인 클래스로 바꾼 경우 작동하며 오류가 발생하지 않습니다. 예 : Type constructed = generic.MakeGenericType(typeof(City));

여기 패턴은이 예외를 throw하지 않는 참조 클래스이지만, 동적으로로드 된 클래스는 않습니다.

아무도 코드가 작동하지 않는 이유를 말해 줄 수 있습니까? 그렇지 않으면 작업 일수가 줄어들어 드로잉 보드로 돌아갑니다.

미리 감사드립니다.

답변

0

EntityType이 정적 유형 또는 런타임이 생성 되었습니까?

+0

'EntityType'은 런타임으로 생성되며 Assembly.Load (...)에 의해 설정된 동적으로 생성 된 클래스를 포함합니다. – Intrepid

+1

나는이 문제를 해결했다. 어떤 형사 작업을 한 후에 나는이 오류가 발생했습니다. _ [A] 은 [B] 로 전송할 수 없습니다. 형식 A는 위치 'C : \ Windows \ Microsoft.NET \ Framework \ v4.0.21006 \ Temporary ASP.NET Files \ root \ 10e649fb \ 634e3b21 \ assembly \ dl3 \ 9f96095e \ 325f141a_f8aaca01 \ <위치'의 컨텍스트에서 기본 '' assemblydllName>을 클릭하십시오. 유형 B는 위치 'D : \ \\ bin \ _의'LoadNeither '컨텍스트에서 에서 비롯됩니다. Assembly.LoadFile()을 사용하여 발생했습니다. Assembly.Load()로 변경하면 문제가 해결되었습니다. 감사! – Intrepid

+1

@Intrepid 5.5 년 후 귀하의 의견은 여전히 ​​유용합니다. 제 경우에는 당신은 제 해결책을 청소하고 재건 할 필요가 있다는 것을 알려 주셨습니다. –