문제

ObjectDataSource와 함께 사용하려는 일반 Repository<T> 클래스가 있습니다.Repository<T>는 DataAccess라는 별도의 프로젝트에 있습니다.에 따르면 MS 뉴스그룹의 이 게시물 (관련 부분은 아래에 복사됨):

내부적으로 ObjectDataSource는 유형을 가져 오려면 type.getType (String)를 호출하므로 유형을 사용하여 유형을 사용하여 유형을 가져 오는 방법에 대해 문서화 된 가이드 라인을 따라야합니다.Type.GetType에서 MSDN Library를 참조할 수 있습니다.

http://msdn2.microsoft.com/en-us/library/w3f99sx1.aspx

문서에서, 당신은 generics를 사용하는 유형 이름을 나타 내기 위해 Backtick (`)을 사용해야한다는 것을 알게됩니다.

또한 여기서는 유형 이름 문자열에 어셈블리 이름을 지정해야 합니다.

따라서 귀하의 질문에 대한 대답은 다음과 같은 유형 이름을 사용하는 것입니다.

TypeName="TestObjectDataSourceAssembly.MyDataHandler`1[System.String],TestObjectDataSourceAssembly"

알았어, 말이 돼.그러나 시도하면 페이지에서 예외가 발생합니다.

<asp:ObjectDataSource ID="MyDataSource" TypeName="MyProject.Repository`1[MyProject.MessageCategory],DataAccess" />

[InvalidOperation예외:ObjectDataSource 'MyDataSource'의 TypeName 속성에 지정된 유형을 찾을 수 없습니다.]

흥미로운 점은 이 문제가 페이지를 볼 때만 발생한다는 것입니다.VS2008 디자이너에서 "데이터 소스 구성" 대화 상자를 열면 제네릭 리포지토리 클래스의 메서드가 제대로 표시됩니다.디버깅하는 동안 TypeName 문자열을 Type.GetType()에 전달하면 유효한 유형이 반환됩니다.그러면 무엇이 주는가?

도움이 되었습니까?

해결책

이런 일을 해보세요.

Type type = typeof(Repository<MessageCategory);
string assemblyQualifiedName = type.AssemblyQualifiedName;

AssemblyQualifiedName 값을 가져와서 TypeName 필드에 붙여넣습니다.Type.GetType(string), 전달된 값은 다음과 같아야 합니다.

가져올 형식의 어셈블리로 한정된 이름입니다.보다 AssemblyQualifiedName.형식이 현재 실행 중인 어셈블리나 Mscorlib.dll에 있는 경우 해당 네임스페이스로 정규화된 형식 이름을 제공하면 충분합니다.

따라서 해당 클래스가 ObjectDataSource가 아닌 현재 실행 중인 어셈블리(호출 중인 위치)에 있기 때문에 코드에 해당 문자열을 전달하면 작동할 수 있습니다.

아마도 당신이 찾고 있는 유형은 다음과 같습니다.

MyProject.Repository`1[MyProject.MessageCategory, DataAccess, Version=1.0.0.0, Culture=neutral, PublicKey=null], DataAccess, Version=1.0.0.0, Culture=neutral, PublicKey=null

다른 팁

나는 이것이 오래된 게시물이라는 것을 알고 있지만 최근에 나 자신도 이 문제를 겪었습니다.또 다른 해결책은 상속을 객체 구성으로 바꾸는 것입니다.

[DataObject]
public class DataAccessObject {
    private Repository<MessageCategory> _repository;

    // ctor omitted for clarity
    // ...

    [DataObjectMethod(DataObjectMethodType.Select)]
    public MessageCategory Get(int key) {
        return _repository.Get(key);
    }
}

이렇게 하면 ObjectDataSource는 클래스 내에 숨겨져 있기 때문에 저장소에 대해 알 수 없습니다.내 Facade 레이어에는 내가 작업 중인 프로젝트에 이 코드를 넣을 수 있는 완벽한 장소인 클래스 라이브러리가 있습니다.

또한 Resharper와 인터페이스를 사용하는 경우 Resharper의 "필드를 사용하여 구현" 기능을 사용하여 Resharper가 리팩토링을 수행하도록 할 수 있습니다.

대런,

귀하의 게시물에 많은 감사를 드립니다.나는 하루 종일 이것 때문에 싸웠습니다.이상하게도 내 경우에는 대괄호를 두 배로 늘려야 합니다.귀하의 코드에 대해 :

MyProject.Repository`1[[MyProject.MessageCategory, DataAccess, 버전=1.0.0.0, Culture=neutral, PublicKey=null]], DataAccess, 버전=1.0.0.0, Culture=neutral, PublicKey=null

알았다

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top