답변:
Type.GetType("namespace.qualified.TypeName")
형식이 mscorlib.dll 또는 현재 실행중인 어셈블리에서 발견 된 경우에만 작동합니다.
위 사항 중 어느 것도 해당되지 않으면 어셈블리 인증 이름 이 필요합니다 .
Type.GetType("namespace.qualified.TypeName, Assembly.Name")
Assembly a = Assembly.Load("SomeLibrary");
유형을로드 할 수 있습니다 – Type t = a.GetType("namespace.a.b.ClassName");
.
typeof(SomeTypeInThatAssembly).Assembly.GetTypes().Where((t) => t.FullName == youFullName);
약간의 번거 로움을 덜어 줄 수도 있습니다.
어셈블리 규정 이름없이 dll 이름으로 유형을 가져올 수도 있습니다. 예를 들면 다음과 같습니다.
Type myClassType = Type.GetType("TypeName,DllName");
나는 같은 상황이 있었고 그것이 나를 위해 일했다. "DataModel.QueueObject"유형의 객체가 필요하고 "DataModel"에 대한 참조가 있으므로 다음과 같이 유형을 가져 왔습니다.
Type type = Type.GetType("DataModel.QueueObject,DataModel");
쉼표 뒤의 두 번째 문자열은 참조 이름 (dll 이름)입니다.
NamespaceTypeName, AssemblyNameSpec
여기서 AssemblyNameSpec
모든 속성없이 조립체의 식별자이다. 이 대답은 본질적으로 동일 비록 내가 그것을 조립 특성을 소개하는 "노이즈"(예를 들어, 일부 멀리 않기 때문에 어떤 사람들이 선호하는 가정 승인으로 Version
, Culture
PublicKeyToken
). 다행히 속성은 선택 사항 입니다.
AtlasKernelBusinessModel.AtlasConstants+ClaimCoverage+Status,AtlasKernelBusinessModel
이 방법을 사용해보십시오
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 ;
}
AppDomain
지원되지 않기 때문에 UWP에서 작동 하지 않습니다. 대안을 모릅니다.
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;
}
T
제네릭 형식은 제거됩니다.
중첩 된 Type 인 경우을 변환하는 것을 잊어 버릴 수 있습니다. +
어쨌든, typeof( T).FullName
당신이 말해야 할 것을 말해 줄 것입니다
편집 : BTW 사용 (아시다시피)은 컴파일 타임에 컴파일러에 대한 지시문 일 뿐이므로 API 호출의 성공에 영향을 줄 수 없습니다. (프로젝트 또는 어셈블리 참조가있는 경우 잠재적으로 영향을 줄 수 있으므로 정보가 쓸모가 없으므로 필터링이 필요합니다 ...)
+
구분 기호를 사용하지만 )
데이터베이스에 지정된 사용자가 액세스 할 수있는 사용자 컨트롤에 따라 사용자 컨트롤을 열고 있습니다. 그래서 나는이 방법을 사용하여 TypeName을 얻습니다 ...
Dim strType As String = GetType(Namespace.ClassName).AssemblyQualifiedName.ToString
Dim obj As UserControl = Activator.CreateInstance(Type.GetType(strType))
이제 strType에서 반환 된 값을 사용하여 해당 객체의 인스턴스를 만들 수 있습니다.
으로 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이 필요하지 않으므로 assemblyName
MyAssembly.GetName (). Name을 사용할 수 있습니다.
형식이 현재 실행중인 어셈블리 나 Mscorlib.dll에 있으면 네임 스페이스로 정규화 된 형식 이름을 제공하기에 충분합니다.
어셈블리 정보가 포함 된 전체 유형 이름을 사용하십시오 (예 :
string typeName = @"MyCompany.MyApp.MyDomain.MyClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null";
Type myClassType = Type.GetType(typeName);
namesspace.classname 만 사용하여 다른 어셈블리의 클래스 유형을 가져올 때와 동일한 상황이 발생했지만 작동하지 않습니다. 위와 같이 형식 정보에 어셈블리 정보를 포함시킬 때만 작동했습니다.
위의 솔루션은 나에게 가장 좋은 것처럼 보이지만 나에게는 효과가 없었으므로 다음과 같이했습니다.
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에서 보이는 절대 경로는 필수 사항이 아닙니다.
나는 속였다. 이름으로 만들려는 유형이 모두 dll I 컨트롤에 있기 때문에 간단한 이름을 취하는 어셈블리의 dll에 정적 메서드를 넣고 해당 컨텍스트에서 type.GetType을 호출하고 결과를 반환합니다. .
원래 목적은 구성 데이터에서 유형으로 이름을 지정할 수 있도록하는 것입니다. 이후 사용자가 처리 할 형식을 지정하도록 코드를 변경했습니다. 형식 핸들러 클래스는 형식이 지정된 형식을 구문 분석 할 수 있는지 판별하는 인터페이스를 구현합니다. 그런 다음 리플렉션을 사용하여 인터페이스를 구현하는 형식을 찾고 형식을 처리하는 형식을 찾습니다. 이제 구성은 특정 유형이 아닌 형식 이름을 지정합니다. 리플렉션 코드는 인접한 dll을보고로드 할 수 있으므로 일종의 가난한 사람의 플러그인 아키텍처가 있습니다.