답변:
Activator.CreateInstance 메소드를 살펴보십시오 .
var driver = (OpenQA.Selenium.IWebDriver)Activator.CreateInstance("WebDriver", "OpenQA.Selenium.Firefox.FirefoxDriver").Unwrap();
꽤 간단합니다. 당신의 클래스 명이라고 가정 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);
dynamic
코드를 - 참조 stackoverflow.com/a/2690661/904521을 )
strFullyQualifiedName
으로 str
, fullyQualifiedName
일을 할 것입니다.
str
는 변수 명명 규칙의 일부로 사용됩니다. 어떤 조직과 프로젝트는 이것을 따라야한다고 주장했습니다. 특정 오라 간화 / 프로젝트에서 일했을 경우, 이것을 알게 될 것입니다. 당신이 str
또한 없이 말한대로 그것은 일을 할 것입니다 :) @MehdiDehghani
이 방법을 성공적으로 사용했습니다.
System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(string className)
반환 된 객체를 원하는 객체 유형으로 캐스트해야합니다.
아마도 내 질문은 더 구체적이었을 것입니다. 실제로 문자열의 기본 클래스를 알고 있으므로 다음과 같이 해결했습니다.
ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass));
Activator.CreateInstance 클래스에는 여러 가지 방법으로 동일한 것을 달성하기위한 다양한 메소드가 있습니다. 나는 그것을 물건에 던질 수 있었지만 위의 상황은 내 상황에 가장 많이 사용됩니다.
ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass));
왜 이런 코드를 작성하고 싶습니까? 'ReportClass'클래스를 사용할 수있는 경우 아래와 같이 직접 인스턴스화 할 수 있습니다.
ReportClass report = new ReportClass();
코드 ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass));
필요한 클래스를 사용할 수 없지만 코드를 동적으로 인스턴스화하거나 호출하려는 경우 가 사용됩니다.
어셈블리를 알 때 유용하지만 코드를 작성하는 동안 클래스를 ReportClass
사용할 수는 없습니다.