Type.GetType (“namespace.abClassName”)은 null을 반환합니다.


216

이 코드는 :

Type.GetType("namespace.a.b.ClassName")

을 반환합니다 null.

그리고 나는 사용에있다 :

using namespace.a.b;

최신 정보:

유형이 존재하고 다른 클래스 라이브러리에 있으며 문자열 이름으로 가져와야합니다.


어셈블리 규정 이름을 얻는 방법에 대한 자세한 내용은이 stackoverflow.com/questions/441680/… 을 참조하십시오 .
Polyfun 2009

답변:


244

Type.GetType("namespace.qualified.TypeName") 형식이 mscorlib.dll 또는 현재 실행중인 어셈블리에서 발견 된 경우에만 작동합니다.

위 사항 중 어느 것도 해당되지 않으면 어셈블리 인증 이름 이 필요합니다 .

Type.GetType("namespace.qualified.TypeName, Assembly.Name")

3
유형이 존재하고 다른 클래스 라이브러리에 있으며 문자열 이름으로
가져와야합니다.

25
어셈블리 한정 이름을 사용하는 대신 이름으로 어셈블리를로드 한 다음 어셈블리에서 이름으로 Assembly a = Assembly.Load("SomeLibrary");유형을로드 할 수 있습니다 – Type t = a.GetType("namespace.a.b.ClassName");.
Kenny Evitt

6
아마도 당신은 typeof(SomeTypeInThatAssembly).Assembly.GetTypes().Where((t) => t.FullName == youFullName);약간의 번거 로움을 덜어 줄 수도 있습니다.
Felype

Felype의 답변은 제가 일할 수있는 유일한 방법이었습니다.
Rudy Scoggins

@Felype 의견에 .FirstOrDefault () 추가
Leandro

173

어셈블리 규정 이름없이 dll 이름으로 유형을 가져올 수도 있습니다. 예를 들면 다음과 같습니다.

Type myClassType = Type.GetType("TypeName,DllName");

나는 같은 상황이 있었고 그것이 나를 위해 일했다. "DataModel.QueueObject"유형의 객체가 필요하고 "DataModel"에 대한 참조가 있으므로 다음과 같이 유형을 가져 왔습니다.

Type type = Type.GetType("DataModel.QueueObject,DataModel");

쉼표 뒤의 두 번째 문자열은 참조 이름 (dll 이름)입니다.


2
이것은 '속임수'입니까 아니면 실제 방법입니까? 설명서 -_-에서 찾을 수 없습니다. 그건 그렇고, 그것은 나의 일주일의 고통을 끝냅니다! 감사합니다
DnR

1
이것은 훨씬 깨끗한 솔루션입니다.이 때문에 함정이 있는지 확인하고 싶습니다.
cossacksman

4
이 답변에 사용 된 형식 은 MSDN 문법에 따른 정규화 된 형식 이름이기도 하므로 속임수 가 아닙니다 . 폼은 NamespaceTypeName, AssemblyNameSpec여기서 AssemblyNameSpec모든 속성없이 조립체의 식별자이다. 이 대답은 본질적으로 동일 비록 내가 그것을 조립 특성을 소개하는 "노이즈"(예를 들어, 일부 멀리 않기 때문에 어떤 사람들이 선호하는 가정 승인으로 Version, Culture PublicKeyToken). 다행히 속성은 선택 사항 입니다.
Martin Liversage

중첩 유형의 경우 다음과 같은 작업이 필요할 수 있습니다.AtlasKernelBusinessModel.AtlasConstants+ClaimCoverage+Status,AtlasKernelBusinessModel
toddmo

감사합니다 .App_Code 폴더에서 작동합니다. 예 : Type.GetType ( "TypeName, App_Code");
Burak Koray Balcı

79

이 방법을 사용해보십시오

 public static Type GetType(string typeName)
        {
            var type = Type.GetType(typeName);
            if (type != null) return type;
            foreach (var a in AppDomain.CurrentDomain.GetAssemblies())
            {
                type = a.GetType(typeName);
                if (type != null)
                    return type;
            }
            return null ;
        }

이것이 실제로 나를 위해 일한 것입니다. 어셈블리 자격 이름을 전달했기 때문에 foreach 루프 앞에 하위 문자열 트림을 추가하여 조정해야했고 어셈블리 정보를 제외하는 경우에만 Assembly.GetType ()이 작동합니다.
콜린

이것은 훌륭해 보이지만 다른 어셈블리 유형을 사용하는 제네릭은 어떻습니까?
Demetris Leptos

AppDomain지원되지 않기 때문에 UWP에서 작동 하지 않습니다. 대안을 모릅니다.
James M

25
Dictionary<string, Type> typeCache;
...
public static bool TryFindType(string typeName, out Type t) {
    lock (typeCache) {
        if (!typeCache.TryGetValue(typeName, out t)) {
            foreach (Assembly a in AppDomain.CurrentDomain.GetAssemblies()) {
                t = a.GetType(typeName);
                if (t != null)
                    break;
            }
            typeCache[typeName] = t; // perhaps null
        }
    }
    return t != null;
}

1
이것은 훌륭해 보이지만 다른 어셈블리 유형을 사용하는 제네릭은 어떻습니까?
Demetris Leptos

1
@DemetrisLeptos (댓글이 오래되었다는 것을 알고 있지만 다른 사람들은 여전히 ​​관심이있을 수 있습니다) : use int index = typeName.IndexOf ( '`'); if (index> 0) {typeName = _typeName.Substring (0, index + 2); } T제네릭 형식은 제거됩니다.
Bernhard Hiller

25

어셈블리가 ASP.NET 응용 프로그램 빌드의 일부인 경우 BuildManager 클래스를 사용할 수 있습니다.

using System.Web.Compilation
...
BuildManager.GetType(typeName, false);

1
이것은 환상적인 답변이며 페이지에서 더 높아야합니다. 매력처럼 작동하며 어셈블리의 정규화 된 형식 이름을 얻는 이전 방법과 비교할 때 매우 간단합니다.
Graham

이것은 놀랍도록 간단하고 반점입니다. 리플렉션 오브젝트의 성능 최적화에 도움을 줄 수 있습니까?
Alok

15

클래스가 현재 assambly 상태가 아닌 경우 QualifiedName을 제공해야하며이 코드는 클래스의 QualifiedName을 얻는 방법을 보여줍니다.

string qualifiedName = typeof(YourClass).AssemblyQualifiedName;

그런 다음 QualifiedName으로 유형을 얻을 수 있습니다.

Type elementType = Type.GetType(qualifiedName);

8

중첩 된 Type 인 경우을 변환하는 것을 잊어 버릴 수 있습니다. +

어쨌든, typeof( T).FullName당신이 말해야 할 것을 말해 줄 것입니다

편집 : BTW 사용 (아시다시피)은 컴파일 타임에 컴파일러에 대한 지시문 일 뿐이므로 API 호출의 성공에 영향을 줄 수 없습니다. (프로젝트 또는 어셈블리 참조가있는 경우 잠재적으로 영향을 줄 수 있으므로 정보가 쓸모가 없으므로 필터링이 필요합니다 ...)


어머! 이 "+"구문이 어디에 설명되어 있는지 알고 있습니까?
수호자 1

1
Protectorone 나는 amazon.com/Essential-NET-Common-Language-Runtime/dp/0201734117 IIRC 에서 배웠지 만 약간 날짜가 있습니다. 모든 .NET 개발자들 에게 amazon.com/CLR-via-4th-Developer-Reference/dp/0735667454/… 를 매우 유용한 책으로 추천 할 수 있습니까 ? 결론적으로, Types의 경우 CLR에는 네임 스페이스 만 있고 이름은 중첩 형식으로 직접 지정할 수 없습니다. 따라서 언어에 중첩 된 유형 개념이있는 경우 필요한 것을 수행합니다 (일반적으로 대부분의 언어는 +구분 기호를 사용하지만 )
Ruben Bartelink

6

데이터베이스에 지정된 사용자가 액세스 할 수있는 사용자 컨트롤에 따라 사용자 컨트롤을 열고 있습니다. 그래서 나는이 방법을 사용하여 TypeName을 얻습니다 ...

Dim strType As String = GetType(Namespace.ClassName).AssemblyQualifiedName.ToString
Dim obj As UserControl = Activator.CreateInstance(Type.GetType(strType))

이제 strType에서 반환 된 값을 사용하여 해당 객체의 인스턴스를 만들 수 있습니다.


서사시 주제를 다시 열면 ... 축하합니다. 그러나 TO가 실제로 Typename을 알고 유형을 얻으려고하기 때문에 귀하의 답변을 공감해야합니다. Btw. : Type.GetType 인 경우 <c> GetType (Namespace.ClassName) </ c>에서 참조하는 메소드는 현재 실행중인 어셈블리 또는 mscorlib 내에있는 유형에서만 작동하지만 TO는 없습니다. 이 조건 중 하나가 적용됩니다.
HimBromBeere

2
@HimBromBeere 다운 투표에 감사드립니다. 내가 찾은 내용을 게시하도록 동기를 부여하는 것은 당신과 같은 사람들입니다. 나는 아직도 개발을 배우고 있으며 다른 사람들을 돕기 위해 노력하고 있습니다. 그리고 지금 당신은 내가 당신의 질문에 대답하기를 기대합니까? 그건 그렇고, 나는 질문에 올바르게 대답했습니다. 인스턴스를 생성하는 클래스는 다른 프로젝트에 상주하므로 그 때문에 AssemblyQualified 이름을 사용해야합니다. 따라서 downvoting하기 전에 나머지 의견을 읽으십시오. "유형이 존재하고 다른 클래스 라이브러리에 있으며 문자열 이름으로 가져와야합니다 – Omu"
Stephan

6

클래스 이름 만 있으면 이것을 사용합니다.

Type obj = AppDomain.CurrentDomain.GetAssemblies().SelectMany(t => t.GetTypes()).Where(t => String.Equals(t.Name, _viewModelName, StringComparison.Ordinal)).First();

5

으로 Type.GetType (문자열) 의 필요성 Type.AssemblyQualifiedName을 당신은 사용해야 Assembly.CreateQualifiedName (문자열, 문자열) .

string typeName = "MyNamespace.MyClass"; // Type.FullName
string assemblyName = "MyAssemblyName"; // MyAssembly.FullName or MyAssembly.GetName().Name
string assemblyQualifiedName = Assembly.CreateQualifiedName(assemblyName , typeName);
Type myClassType = Type.GetType(assemblyQualifiedName);

Version, Culture 및 PublicKeyToken이 필요하지 않으므로 assemblyNameMyAssembly.GetName (). Name을 사용할 수 있습니다.

Type.GetType (문자열) :

형식이 현재 실행중인 어셈블리 나 Mscorlib.dll에 있으면 네임 스페이스로 정규화 된 형식 이름을 제공하기에 충분합니다.


4

어셈블리가 참조되고 클래스가 보이는 경우 :

typeof(namespace.a.b.ClassName)

형식을 찾을 수 없으므로 GetType은 null을 반환합니다. typeof를 사용하면 컴파일러에서 오류를 찾는 데 도움이 될 수 있습니다.


유형이 존재하고 다른 클래스 라이브러리에 있으며 문자열 이름으로
가져와야합니다.

4

어셈블리 정보가 포함 된 전체 유형 이름을 사용하십시오 (예 :

string typeName = @"MyCompany.MyApp.MyDomain.MyClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null";
Type myClassType = Type.GetType(typeName);

namesspace.classname 만 사용하여 다른 어셈블리의 클래스 유형을 가져올 때와 동일한 상황이 발생했지만 작동하지 않습니다. 위와 같이 형식 정보에 어셈블리 정보를 포함시킬 때만 작동했습니다.


3

쉼표가 완전한 이름 바로 다음에 오도록하십시오

typeof(namespace.a.b.ClassName, AssemblyName)

이것이 작동하지 않기 때문에

typeof(namespace.a.b.ClassName ,AssemblyName)

나는 이것에 며칠 동안 걸려


2

저에게는 "+"가 핵심이었습니다! 이것은 내 클래스입니다 (중첩 된 클래스입니다).

namespace PortalServices
{
public class PortalManagement : WebService
{
    public class Merchant
    {}
}
}

이 코드 줄은 작동했습니다.

Type type = Type.GetType("PortalServices.PortalManagement+Merchant");

1

위의 솔루션은 나에게 가장 좋은 것처럼 보이지만 나에게는 효과가 없었으므로 다음과 같이했습니다.

AssemblyName assemblyName = AssemblyName.GetAssemblyName(HttpContext.Current.Server.MapPath("~\\Bin\\AnotherAssembly.dll"));
string typeAssemblyQualifiedName = string.Join(", ", "MyNamespace.MyType", assemblyName.FullName);

Type myType = Type.GetType(typeAssemblyQualifiedName);

전제 조건은 어셈블리의 경로를 알아야한다는 것입니다. 내 경우에는 다른 내부 프로젝트로 빌드 된 어셈블리이므로 프로젝트의 bin 폴더에 포함되어 있기 때문에 알고 있습니다.

Visual Studio 2013을 사용하는 것이 중요한 경우 대상 .NET은 4.0입니다. 이것은 ASP.NET 프로젝트이므로를 통해 절대 경로를 얻고 HttpContext있습니다. 그러나 AssemblyQualifiedNames의 MSDN에서 보이는 절대 경로는 필수 사항이 아닙니다.


0

나는 속였다. 이름으로 만들려는 유형이 모두 dll I 컨트롤에 있기 때문에 간단한 이름을 취하는 어셈블리의 dll에 정적 메서드를 넣고 해당 컨텍스트에서 type.GetType을 호출하고 결과를 반환합니다. .

원래 목적은 구성 데이터에서 유형으로 이름을 지정할 수 있도록하는 것입니다. 이후 사용자가 처리 할 형식을 지정하도록 코드를 변경했습니다. 형식 핸들러 클래스는 형식이 지정된 형식을 구문 분석 할 수 있는지 판별하는 인터페이스를 구현합니다. 그런 다음 리플렉션을 사용하여 인터페이스를 구현하는 형식을 찾고 형식을 처리하는 형식을 찾습니다. 이제 구성은 특정 유형이 아닌 형식 이름을 지정합니다. 리플렉션 코드는 인접한 dll을보고로드 할 수 있으므로 일종의 가난한 사람의 플러그인 아키텍처가 있습니다.


안녕하세요, 실수로 다운 보증을 받았습니다. 답장을 수정하여 취소 할 수 있습니다.
coloboxp
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.