반응형
C#에서 문자열을 유형으로 변환
클래스 이름이 포함된 문자열을 수신하고 이 문자열을 실제 유형(문자열에 있는 문자열)으로 변환하려면 어떻게 해야 합니까?
나는 노력했다.
Type.GetType("System.Int32")
예를 들어, 작동하는 것처럼 보입니다.
하지만 제 개체로 시도하면 항상 null을 반환합니다...
문자열에 무엇이 들어갈지 미리 알 수 없기 때문에 실제 유형으로 변환할 수 있는 유일한 소스입니다.
Type.GetType("NameSpace.MyClasse");
감 잡히는 게 없어요?
형식이 다음과 같은 경우에만 형식 이름(이름 공간 포함)을 사용할 수 있습니다.mscorlib
또는 호출 어셈블리.그렇지 않으면 어셈블리 이름도 포함해야 합니다.
Type type = Type.GetType("Namespace.MyClass, MyAssembly");
어셈블리의 이름이 강력하다면 모든 정보도 포함해야 합니다.자세한 내용은 의 설명서를 참조하십시오.
또는 어셈블리에 대한 참조가 이미 있는 경우(예: 잘 알려진 유형을 통해) 다음을 사용할 수 있습니다.
Assembly asm = typeof(SomeKnownType).Assembly;
Type type = asm.GetType(namespaceQualifiedTypeName);
시도:
Type type = Type.GetType(inputString); //target type
object o = Activator.CreateInstance(type); // an instance of target type
YourType your = (YourType)o;
존 스키트가 평소처럼 옳습니다 :)
업데이트: Jon이 언급한 것처럼 대상 유형을 포함하는 어셈블리를 다양한 방법으로 지정할 수 있습니다.
YourType your = (YourType)Activator.CreateInstance("AssemblyName", "NameSpace.MyClass");
이름으로 형식을 지정하려면 다음을 사용할 수 있습니다.
System.AppDomain.CurrentDomain.GetAssemblies().SelectMany(x => x.GetTypes()).First(x => x.Name == "theassembly");
로드하려는 유형에 대한 정보가 많을수록 성능이 크게 향상될 수 있습니다.
다음 LoadType 방법을 사용하여 시스템을 사용합니다.모든 등록된(GAC) 및 참조된 어셈블리를 로드하고 유형Name을 확인하기 위한 반사
public Type[] LoadType(string typeName)
{
return LoadType(typeName, true);
}
public Type[] LoadType(string typeName, bool referenced)
{
return LoadType(typeName, referenced, true);
}
private Type[] LoadType(string typeName, bool referenced, bool gac)
{
//check for problematic work
if (string.IsNullOrEmpty(typeName) || !referenced && !gac)
return new Type[] { };
Assembly currentAssembly = Assembly.GetExecutingAssembly();
List<string> assemblyFullnames = new List<string>();
List<Type> types = new List<Type>();
if (referenced)
{ //Check refrenced assemblies
foreach (AssemblyName assemblyName in currentAssembly.GetReferencedAssemblies())
{
//Load method resolve refrenced loaded assembly
Assembly assembly = Assembly.Load(assemblyName.FullName);
//Check if type is exists in assembly
var type = assembly.GetType(typeName, false, true);
if (type != null && !assemblyFullnames.Contains(assembly.FullName))
{
types.Add(type);
assemblyFullnames.Add(assembly.FullName);
}
}
}
if (gac)
{
//GAC files
string gacPath = Environment.GetFolderPath(System.Environment.SpecialFolder.Windows) + "\\assembly";
var files = GetGlobalAssemblyCacheFiles(gacPath);
foreach (string file in files)
{
try
{
//reflection only
Assembly assembly = Assembly.ReflectionOnlyLoadFrom(file);
//Check if type is exists in assembly
var type = assembly.GetType(typeName, false, true);
if (type != null && !assemblyFullnames.Contains(assembly.FullName))
{
types.Add(type);
assemblyFullnames.Add(assembly.FullName);
}
}
catch
{
//your custom handling
}
}
}
return types.ToArray();
}
public static string[] GetGlobalAssemblyCacheFiles(string path)
{
List<string> files = new List<string>();
DirectoryInfo di = new DirectoryInfo(path);
foreach (FileInfo fi in di.GetFiles("*.dll"))
{
files.Add(fi.FullName);
}
foreach (DirectoryInfo diChild in di.GetDirectories())
{
var files2 = GetGlobalAssemblyCacheFiles(diChild.FullName);
files.AddRange(files2);
}
return files.ToArray();
}
언급URL : https://stackoverflow.com/questions/11107536/convert-string-to-type-in-c-sharp
반응형
'source' 카테고리의 다른 글
코어 php 코드로 워드프레스 데이터베이스에 액세스할 수 있는 방법이 있습니까? (0) | 2023.07.31 |
---|---|
네이티브 SQL 준비 문을 사용하여 열 이름을 준비하는 방법 (0) | 2023.07.31 |
Oracle SQL Developer와 비교하여 더 나은 툴이 있습니까? (0) | 2023.07.31 |
SQL Server Varchar를 Datetime으로 변환 (0) | 2023.07.31 |
버전 제어 독립 레코드 및 구성을 기반으로 모든 레코드 나열 (0) | 2023.07.31 |