문제

아니요, 이것은 제네릭에 관한 질문이 아닙니다.

내부 생성자가 있는 여러 클래스가 있는 팩토리 패턴이 있습니다. 팩토리를 통하지 않으면 인스턴스화되는 것을 원하지 않습니다.

내 문제는 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에 기본 생성자가 있어야 합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top