it-source

문자열에서 클래스 인스턴스 만들기

criticalcode 2023. 5. 6. 15:09
반응형

문자열에서 클래스 인스턴스 만들기

런타임에 클래스 이름을 알고 있다는 사실을 기반으로 클래스의 인스턴스를 만드는 방법이 있습니까?기본적으로 저는 클래스의 이름을 문자열로 가지고 있습니다.

활성화 프로그램을 살펴봅니다.CreateInstance 메서드입니다.

꽤 간단합니다.클래스 이름이 다음과 같다고 가정합니다.Car그리고 네임스페이스는Vehicles그런 다음 매개 변수를 다음과 같이 전달합니다.Vehicles.Car유형의 개체를 반환합니다.Car이와 같이 모든 클래스의 인스턴스를 동적으로 만들 수 있습니다.

public object GetInstance(string strFullyQualifiedName)
{         
     Type t = Type.GetType(strFullyQualifiedName); 
     return  Activator.CreateInstance(t);         
}

정규화된 이름(즉,Vehicles.Car이 경우)는 다른 어셈블리에 있습니다.Type.GetTypenull이 됩니다.이러한 경우, 모든 어셈블리를 루프하고 다음을 찾습니다.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

반응형