Activator.CreateInstance(string) 및 Activator.CreateInstance<T>() 차이점
-
09-06-2019 - |
문제
아니요, 이것은 제네릭에 관한 질문이 아닙니다.
내부 생성자가 있는 여러 클래스가 있는 팩토리 패턴이 있습니다. 팩토리를 통하지 않으면 인스턴스화되는 것을 원하지 않습니다.
내 문제는 CreateInstance
비공개 매개 변수에 "true"를 전달하지 않으면 "이 개체에 대해 매개 변수 없는 생성자가 정의되어 있지 않습니다." 오류와 함께 실패합니다.
예
// Fails
Activator.CreateInstance(type);
// Works
Activator.CreateInstance(type, true);
나는 공장을 좀 더 단순하게 만들기 위해 다음과 같이 일반 공장을 만들고 싶었습니다.
public class GenericFactory<T> where T : MyAbstractType
{
public static T GetInstance()
{
return Activator.CreateInstance<T>();
}
}
그러나 비공개 생성자(내부)를 허용하기 위해 "true" 매개변수를 전달하는 방법을 찾을 수 없었습니다.
제가 뭔가를 놓쳤나요? 아니면 불가능한가요?
해결책
이 문제를 해결하려면 사용법을 다음과 같이 변경할 수 없습니다.
public class GenericFactory<T> where T : MyAbstractType
{
public static T GetInstance()
{
return Activator.CreateInstance(typeof(T), true);
}
}
팩토리 메서드는 여전히 제네릭이지만 활성기에 대한 호출에서는 제네릭 오버로드를 사용하지 않습니다.하지만 여전히 동일한 결과를 얻어야 합니다.
다른 팁
생성자가 비공개여야 하는 경우 다음과 같이 시도해 볼 수 있습니다.
public abstract class GenericFactory<T> where T : MyAbstractType
{
public static T GetInstance()
{
return (T)Activator.CreateInstance(typeof(T), true);
}
}
그렇지 않으면 새 제약 조건을 추가하고 해당 경로로 이동하는 것이 가장 좋습니다.
public abstract class GenericFactory<T> where T : MyAbstractType, new()
{
public static T GetInstance()
{
return new T;
}
}
처음부터 각각을 작성하는 대신 GenericFactory를 모든 팩토리의 기본 클래스로 사용하려고 하시나요?
Activator.CreateInstance(typeof(T), true)가 작동하려면 T에 기본 생성자가 있어야 합니다.
제휴하지 않습니다 StackOverflow