2009-09-08 4 views
12

에서 C#을 입력 만들기 folowing :는 내가하고 있어요 I 형 이름에서 Type 개체를 얻으려고 이름

Assembly asm = Assembly.GetEntryAssembly(); 
string toNativeTypeName="any type full name"; 
Type t = asm.GetType(toNativeTypeName); 

내가 널 얻을, 왜?

조립 내 실행 파일 (.NET 실행 파일) 및 인 유형 이름은 다음과 같습니다 System.Xml.XmlNode

+0

당신은 전체 이름을 의미합니까? – AnthonyWJones

+0

어셈블리는 내 실행 파일 (.net 실행 파일)이며 형식 이름은 System.Xml.XmlNode입니다. –

+0

System.Xml.XmlNode는 어셈블리에 존재하지 않으므로 Assembly.GetType의 Type.GetType inestead를 사용해야합니다. –

답변

27

글쎄, 그건 정말 (즉, 네임 스페이스 포함) 유형의 전체 이름이며 그 어셈블리의 경우, 그러면 작동합니다. 그렇지 않은 경우를 보여줄 수 있습니까? Type.GetType 대신 Assembly.GetType을 사용하고 있으므로 에 형식 이름에 어셈블리 이름을 포함하면 안됩니다.

제네릭 형식의 이름은 예상 할 수없는 이름입니다. 예를 들어, 사용하십시오 :

assembly.GetType("System.Collections.Generic.List`1"); 

가 일반 목록 유형을 얻기 위해 입력 한 다음 인수를 제공하기 위해 Type.MakeGenericType를 사용합니다.

물론 유형이 제네릭 일 때만 관련이 있습니다. 그게 문제가 아니라면 유형이 실제로 입력 어셈블리에 있는지 확인합니다.

편집 : 아, 그리고 그와 관련이있는 경우 중첩 된 유형 오히려 "Container.Nested"이 아닌 "컨테이너 + 중첩"될 것이라고 알고 ...

+0

어셈블리는 내 실행 파일 (.net 실행 파일)이며 형식 이름은 System.Xml.XmlNode –

+4

입니다. 그러면 문제가 발생합니다. System.Xml.XmlNode가 어셈블리 내의 형식이 아닙니까? 올바른 어셈블리를 사용하거나 Type.GetType을 전체 어셈블리 정보와 함께 호출해야합니다. –

+0

+1 좋은 정보가 많이 있습니다. –

4

귀하의 유형 이름은 대부분의 아마 잘못된 것입니다. 코드에서 해당 형식에 대한 참조를 만든 다음 Type.FullName 속성을 확인하면 유형 이름이 어떻게 표시되는지 확인할 수 있습니다.

또한 Type.GetType 메서드를 시도하고 반환하는 내용을 확인할 수 있습니다. 어쩌면 당신 타입이 그 어셈블리에 전혀 없을 수도 있습니다.

편집 : Type.FullName 속성을 사용하는 것에 대해 잘못된 것으로 나타났습니다. Type.AssemblyQualifiedName 속성을 사용하면 Type.GetType에서 사용할 수있는 정규화 된 이름을 가져옵니다.

다음과 같은 이름을 가져 System.Xml.XmlNode를 들어

: System.Xml.XmlElement, System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

6

왜 당신은 또한 당신은 내가이 스레드를 건너 왔어요 네임 스페이스를

string toNativeTypeName = "System.Int32"; 
Type t = Type.GetType(toNativeTypeName); 
MessageBox.Show(t.FullName); 
+3

* 입력 항목 어셈블리에 * 유형 *가있는 경우 Assembly.GetType을 네임 스페이스를 포함하지만 어셈블리 이름이 아닌 이름과 함께 사용하면 버전을 포함한 전체 어셈블리 이름을 포함하는 것보다 훨씬 쉽습니다. –

+0

이것은 나를 도왔습니다. 큐에서 일련 화 된 메시지를 가져 오려고했습니다. 나는 System.String으로 테스트 중이었고 현재 도메인의 모든 어셈블리를 루핑하는 동안 찾지 못했습니다. Type.GetType을 사용하도록 변경하면 방금 효과가있었습니다. 팁 고마워. – fizch

3

을 둘 필요가!, 입력받을 사용하는 어셈블리를 정의하는 원래의 질문에 대해서는 아직 답을 찾지 못했다는 사실을 알게되었습니다. 나는 틀릴 수도 있지만 질문을 읽을 때 저자의 의도는 응용 프로그램의 참조 또는 일부인 어셈블리에서 단순히 유형을 가져올 수있는 것이라고 생각합니다.

다음은이 문제를 해결하기 위해 수행 한 작업입니다.

Type t = System.Web.Compilation.BuildManager.GetType("the.type", true, false); 

사용 반사판을 어떻게하는지보고, 적어도 위해 :

public static Type GetTypeFromFullName(string fullClassName) 
{ 
    AssemblyPartCollection parts = Deployment.Current.Parts; 

    foreach (var part in parts) 
    { 
     Uri resUri = new Uri(part.Source, UriKind.Relative); 
     Stream resStream = Application.GetResourceStream(resUri).Stream; 
     Assembly resAssembly = part.Load(resStream); 
     Type tryType = resAssembly.GetType(fullClassName, false); 
     if (tryType != null) 
      return tryType; 
    } 

    return null; 
} 
8

만 여기

private static Type GetBusinessEntityType(string typeName) 
{ 
    Debug.Assert(typeName != null); 

    List<System.Reflection.Assembly> assemblies = AppDomain.CurrentDomain.GetAssemblies() 
     .Where(a => a.FullName.StartsWith("AF.BusinessEntities")).ToList(); 

    foreach (var assembly in assemblies) 
    { 
     Type t = assembly.GetType(typeName, false); 
     if (t != null) 
      return t; 
    } 
    throw new ArgumentException(
     "Type " + typeName + " doesn't exist in the current app domain"); 
} 

속도

사업 네임 스페이스를 루핑, 아래에있는 내 제안을 참조 그것을 할 다른 방법 재미 :)

+1

'System.Web.Compilation.BuildManager'는 저에게 해주었습니다. 다른 하나는 Enum을 위해 작동하지 않았습니다 :'NLibrary + Modules' – Niels

관련 문제