문자열에서 클래스 인스턴스 만들기
런타임에 클래스 이름을 알고 있다는 사실을 기반으로 클래스의 인스턴스를 만드는 방법이 있습니까?기본적으로 저는 클래스의 이름을 문자열로 가지고 있습니다.
활성화 프로그램을 살펴봅니다.CreateInstance 메서드입니다.
꽤 간단합니다.클래스 이름이 다음과 같다고 가정합니다.Car
그리고 네임스페이스는Vehicles
그런 다음 매개 변수를 다음과 같이 전달합니다.Vehicles.Car
유형의 개체를 반환합니다.Car
이와 같이 모든 클래스의 인스턴스를 동적으로 만들 수 있습니다.
public object GetInstance(string strFullyQualifiedName)
{
Type t = Type.GetType(strFullyQualifiedName);
return Activator.CreateInstance(t);
}
정규화된 이름(즉,Vehicles.Car
이 경우)는 다른 어셈블리에 있습니다.Type.GetType
null이 됩니다.이러한 경우, 모든 어셈블리를 루프하고 다음을 찾습니다.Type
이를 위해 아래 코드를 사용할 수 있습니다.
public object GetInstance(string strFullyQualifiedName)
{
Type type = Type.GetType(strFullyQualifiedName);
if (type != null)
return Activator.CreateInstance(type);
foreach (var asm in AppDomain.CurrentDomain.GetAssemblies())
{
type = asm.GetType(strFullyQualifiedName);
if (type != null)
return Activator.CreateInstance(type);
}
return null;
}
매개 변수화된 생성자를 호출하려면 다음을 수행합니다.
Activator.CreateInstance(t,17); // Incase you are calling a constructor of int type
대신에
Activator.CreateInstance(t);
이 방법을 성공적으로 사용했습니다.
System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(string className)
반환된 개체를 원하는 개체 유형으로 캐스팅해야 합니다.
아마도 제 질문은 좀 더 구체적이어야 했을 것입니다.나는 실제로 문자열에 대한 기본 클래스를 알고 있으므로 다음과 같이 해결합니다.
ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass));
활성화 프로그램.CreateInstance 클래스에는 여러 가지 방법으로 동일한 작업을 수행할 수 있는 다양한 메서드가 있습니다.나는 그것을 물체에 던질 수 있었지만 위의 것이 내 상황에 가장 유용합니다.
솔루션의 다른 프로젝트에서 클래스 인스턴스를 만들려면 클래스 이름(예: BaseEntity)으로 표시된 어셈블리를 가져와 새 인스턴스를 만들 수 있습니다.
var newClass = System.Reflection.Assembly.GetAssembly(typeof(BaseEntity)).CreateInstance("MyProject.Entities.User");
제가 게임에 늦었다는 것을 압니다...하지만 여러분이 찾고 있는 해결책은 위의 조합일 수도 있고, 공개적으로 액세스할 수 있는 측면을 정의하기 위해 인터페이스를 사용하는 것일 수도 있습니다.
그런 다음 이러한 방식으로 생성되는 모든 클래스가 해당 인터페이스를 구현하는 경우 인터페이스 유형으로 캐스팅하고 결과 개체로 작업할 수 있습니다.
예를 들어 데이터베이스 필드에 다양한 유형의 값을 저장하고(문자열로 저장됨) 유형 이름을 가진 다른 필드(예: String, bool, int, MyClass)가 있는 경우 해당 필드 데이터에서 위의 코드를 사용하여 모든 유형의 클래스를 만들고 첫 번째 필드의 값으로 채울 수 있습니다.물론 이는 문자열을 올바른 형식으로 구문 분석하는 방법을 사용하여 저장하는 형식에 따라 다릅니다.사용자 환경설정을 데이터베이스에 저장하기 위해 여러 번 사용했습니다.
ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass));
당신은 왜 이런 코드를 쓰고 싶습니까?'ReportClass' 클래스를 사용할 수 있는 경우 아래와 같이 직접 인스턴스화할 수 있습니다.
ReportClass report = new ReportClass();
드ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass));
필요한 클래스를 사용할 수 없지만 메서드를 동적으로 인스턴스화 및/또는 호출하려는 경우 사용됩니다.
때 하다는 것입니다.ReportClass
이용할 수 있는.
언급URL : https://stackoverflow.com/questions/223952/create-an-instance-of-a-class-from-a-string
'it-source' 카테고리의 다른 글
INOTIFY 구현변경된 속성 - 더 나은 방법이 있습니까? (0) | 2023.05.06 |
---|---|
목록에 다른 목록이 있는지 확인합니다. (0) | 2023.05.06 |
특성 오류: 'module' 개체에 'urlopen' 특성이 없습니다. (0) | 2023.05.06 |
집계하는 동안 MongoDB에 $second에 다른 if가 있습니까? (0) | 2023.05.06 |
postgresql에서 배열 크기를 찾는 방법 (0) | 2023.05.06 |