2013-03-13 5 views
1

특이한 문제가 발생했습니다. 나는 동적 인 공장 프로젝트에서 일하고 있는데 나의 의도는 XML 파일을 기반으로 새로운 객체를 생성하는 것이다. Type.GetType() 프로젝트 간 가시성 문제 (Visual C#)

  1. 은 내가

    다음과 같이 내가 Create 정적 메소드가이 추상 클래스에서

    public abstract class DynamicContentFactory<T, Params> where T: class where Params: DynamicParameters 
    
  2. 이 공장의 기본 클래스에 대한 별도의 프로젝트를 가지고 내 문제는 이것이다

    public static T Create(Params data) 
    
  3. ParamsType이라는 기본값으로 하나의 문자열 만 포함합니다. 나는 기본 클래스 T과 같은 네임 스페이스에 객체의 생성을 제한하려면, 그래서 다음을 수행하십시오 내 주요 프로젝트에서

    string namespaceStr = typeof(T).ToString(); 
    namespaceStr = namespaceStr.Substring(0, namespaceStr.LastIndexOf('.') + 1); 
    
    Type type = Type.GetType(namespaceStr + data.Type); 
    
  4. , 나는 특정 팩토리 클래스

    public class ItemFactory : DynamicContent.DynamicContentFactory<ItemFactory, ItemParameters> 
    { 
    } 
    
  5. 에게 있습니다

    문제는 ItemFactory.Create으로 전화하면 Type.GetTypenull을 반환합니다. ItemFactory은 생성하려는 항목과 동일한 네임 스페이스에 있지만 기본 클래스는 다른 항목에 있습니다. 이 주위에 어떤 방법이 있습니까?

  6. Type.GetType()의 매개 변수를 typeof(T).ToString()으로 변경하려고 시도했으나 찾을 수 있는지 테스트하지 못했습니다. 다른 방법에 대한 링크가 이미 존재하므로 내 DynamicContent 프로젝트를 내 기본 프로젝트에 연결할 수 없습니다. 나는 심지어는 초기화 된 클래스의 유형을 찾을 수 없다는 어리석은 느낌

그래서 제 질문은 다음과 같습니다.이 문제를 해결 갈 수있는 가장 좋은 방법이 될 것입니다 무엇? 내 DynamicContent 프로젝트를 메인 프로젝트에 포함시키지 않고 별도의 라이브러리로 유지하는 것을 선호합니다. 클래스를 찾거나 기본 프로젝트와 DynamicContent 프로젝트에서 프로젝트를 참조 할 수 있도록이 클래스를 사용하여 초기화하려는 유형의 세 번째 프로젝트를 만들어야합니까?

BR,

-Sami는 당신이 관찰된다

답변

4

동작이 예상됩니다 - Type.GetType

유형 이름 - 조립 수식 명 얻을 수있는 유형의을. AssemblyQualifiedName을 참조하십시오. 형식이 현재 실행중인 어셈블리 나 Mscorlib.dll에 있으면 해당 네임 스페이스에서 정규화 된 형식 이름을 제공하기 만하면됩니다.

네임 스페이스 + 이름만으로도 지정된 동작의 "현재 실행중인 어셈블리"부분에 해당하므로 현재 코드가 작동합니다.

  • 형식을 요청할 때 전체 이름을 지정해야하지만 형식에서 사용할 네임 스페이스를 확인할 수 있습니다.
  • Type.GetType 대신 Assembly.GetType으로 전환하고 만들려는 검색 유형에 T의 어셈블리를 사용할 수 있습니다.
  • 로드 된 어셈블리를 원하는 유형으로 스캔하는 대신, 아직 유형이로드되지 않은 어셈블리에서 오는 경우 충분하지 않을 수 있습니다.

나머지 : 닷넷의 네임 스페이스 이름은 그다지 의미가 없습니다. 코드를보다 쉽게 ​​읽을 수 있도록하기위한 규칙이지만 어셈블리와 구현 된 네임 스페이스 간에는 특별한 링크가 없습니다.

+0

고맙습니다! 그것은 공정한 비트를 명확히합니다. Assembly.GetCallingAssembly(). GetType()을 호출하여이 문제를 해결할 수 있었기 때문에 그 라인을 따라 뭔가를 발견했습니다. 우리가 T를 포함하도록 CallingAssembly를 보장 할 수 없다는 점에서 나쁘지는 않을 것 같습니다. –

+0

동일한 이름을 가진 타입 간의 모호성 해결과 같은 네임 스페이스의 다른 기능을 잊지 마세요. – Charleh