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


168

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

137

Activator.CreateInstance 메소드를 살펴보십시오.

+14

의 마십시오 <strong>매개 변수화 된 생성자</strong>를 호출 할 경우 그 위해 당신은 이제 아래 코드</p> <pre><code>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; } </code></pre> <p>을 사용할 수 있습니다 : //stackoverflow.com/questions/493490/converting-a-string-to-a-class-name 24 apr. 132013-04-24 14:23:37

  0

또한이 게시물은 사용자의 유형을 찾아야하기 때문에 관련성이 있습니다. http : // st ackoverflow.com/questions/1825147/type-gettypenamespace-ab-classname-returns-null 23 aug. 132013-08-23 20:48:13

+4

예 :' var driver = (OpenQA.Selenium.IWebDriver) Activator.CreateInstance ("WebDriver", "OpenQA.Selenium.Firefox.FirefoxDriver") Unwrap(); ' 04 oct. 142014-10-04 04:37:07

+2

여기에서 중요한 참고 사항 :. 리모컨 핸들을 지나치게 통과하려면 Unwrap 당신은 실제로 캐스트를 할 수 있습니다. @Endy - 감사합니다 20 jul. 152015-07-20 01:31:38


49

나는이 방법을 성공적으로 사용했습니다

System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(string className) 

당신이 원하는 개체 유형에 반환 된 객체를 캐스팅해야합니다.

  0

흠 .. 사용자 이름이 고유하지 않습니다. 21 oct. 082008-10-21 23:48:02

+7

클래스 이름을 통해 개체를 만든 다음 해당 유형으로 캐스팅하는 것이 전혀 의미가없는 시나리오를 상상해보십시오. 21 oct. 082008-10-21 23:53:35

+11

무슨 뜻인지 알 겠어. 그것은 불필요한 것처럼 보입니다. 클래스 이름을 아는 경우 왜 동적 문자열이 필요합니까? 한 가지 상황은 기본 클래스로 캐스팅하고 문자열이 기본 클래스의 자손을 나타내는 것일 수 있습니다. 21 oct. 082008-10-21 23:58:29

+3

기본 클래스를 알고있는 경우 기본 클래스 또는이 클래스의 인터페이스를 인수로 사용하여 리플렉션없이 자손을 전달할 수 있습니다. 25 jan. 142014-01-25 09:01:11

+2

유용한 시나리오 : 직렬화 인터페이스 나 다른 일반적인 인터페이스 만 있으면됩니다. 당신은 그것을 클래스에 던지지 않을 것이지만 적어도 객체보다 더 많은 것에 08 dec. 142014-12-08 11:08:49

  0

Xaml을 클릭하면 새 탐색 페이지로가는 것이 완벽한 예입니다. 더 많은 것을 생각할 수 있습니다. 05 jan. 162016-01-05 19:03:08

+1

주어진 문자열 __from에서 캐스트를 수행하는 방법 ?? 25 apr. 162016-04-25 12:00:04


16

아마도 내 질문이 더 구체적이어야했습니다.

ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass)); 

Activator.CreateInstance로 클래스가 다른 방법으로 같은 일을 달성하기 위해 다양한 방법이있다 : 나는 실제로 문자열에 대한 기본 클래스 그렇게하여 해결 알고있다. 나는 그것을 물건에 던질 수 있었지만 위의 것은 나의 상황에서 가장 많이 사용되었다.

+2

질문 섹션에서 응답하는 대신 질문을 편집하고 변경 사항을 기록하는 것이 좋습니다. 당신은 그것을하기위한 더/더 나은 답을 얻을 것입니다. 22 oct. 082008-10-22 00:53:45

  0

근무한 특정 코드 줄을 게시 해 주셔서 감사합니다. 모든 CreateInstance 오버로드를 통해 정렬하고 형식을 생성하는 여러 가지 방법을 사용하면 많은 시간을 들여 나를 구해 냈습니다. 05 jan. 112011-01-05 22:01:12


3

구현하려는 솔루션을 설명했지만 해결하려는 문제는 설명하지 않은 것 같습니다.

아마 당신은 확장 성을 가지고 뭔가를하려하고 있는데,이 경우 Managed Extensibility Framework을 확인해 보는 것이 좋습니다.


-8
ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass)); 

왜 이런 코드를 작성 하시겠습니까? 'ReportClass'클래스를 사용할 수있는 경우 아래에 표시된대로 직접 인스턴스화 할 수 있습니다.

ReportClass report = new ReportClass(); 

코드 ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass));는 당신이 필요한 클래스를 사용할 해달라고 할 때 사용하지만 인스턴스화 싶어하거나 또는 동적으로 메소드를 호출한다.

나는 어셈블리를 알고 있지만 코드를 작성하는 동안 클래스 ReportClass을 사용할 수 없다는 것을 의미합니다.


1

예를 들어, 데이터베이스 필드 (문자열로 저장 됨)에 다양한 유형의 값을 저장하고 유형 이름 (즉, String, bool, int, MyClass)을 가진 다른 필드가있는 경우 해당 필드 데이터에서 아마도 위의 코드를 사용하여 모든 유형의 클래스를 만들고이를 첫 번째 필드의 값으로 채울 수 있습니다. 물론 이것은 문자열을 올바른 형식으로 구문 분석하는 메서드를 저장하는 형식에 따라 다릅니다. 필자는 데이터베이스에 사용자 환경 설정을 저장하는 데이 여러 번 사용했습니다.


4

나는 게임에 늦었다는 것을 알고있다. 그러나 당신이 찾고있는 솔루션은 위의 조합 일 수 있으며 인터페이스를 사용하여 개체를 공개적으로 액세스 할 수있는 측면을 정의 할 수있다.

그런 다음 생성 된 모든 클래스가 해당 인터페이스를 구현하면 인터페이스 유형으로 캐스팅하고 결과 객체로 작업 할 수 있습니다.


37

매우 간단합니다. 클래스 이름이 Car이고 네임 스페이스가 Vehicles이라고 가정하고 Vehicles.Car이라는 매개 변수를 전달하면 Car 유형의 개체가 반환됩니다. 이처럼 모든 클래스의 인스턴스를 동적으로 만들 수 있습니다.

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

당신의 Fully Qualified Name (즉,이 경우 Vehicles.Car가) 다른 어셈블리에의 Type.GetType가 null가됩니다. 이 경우 모든 어셈블리를 반복하고 Type을 찾습니다. HTTP : 다음

Activator.CreateInstance(t,17); // Incase you are calling a constructor of int type 

대신 좋은 예와 관련

Activator.CreateInstance(t); 
  0

캐스팅하지 않고 사용하는 방법과 주어진 문자열을 캐스팅하는 방법 __from__ ?? 25 apr. 162016-04-25 12:16:06

  0

@TaW - 클래스 인스턴스를 사용하려면 수행 할 작업에 대한 지식이 필요합니다. 그렇지 않으면 사용할 수 없습니다. 이것에 대한 가장 일반적인 사용 사례는 미리 정의 된 계약을 제공하는 일부 인터페이스로 캐스팅하는 것입니다. (이것은 '동적'코드를 사용하지 않는 한 유지됩니다 - http://stackoverflow.com/a/2690661/904521 참조) 25 may. 162016-05-25 08:47:28