Programing

Type의 기본 생성자를 얻는 가장 효율적인 방법

crosscheck 2020. 11. 4. 07:41
반응형

Type의 기본 생성자를 얻는 가장 효율적인 방법


System.Type의 기본 생성자 (즉, 매개 변수가없는 인스턴스 생성자)를 얻는 가장 효율적인 방법은 무엇입니까?

나는 아래 코드 줄을 따라 무언가를 생각하고 있었지만 그것을 수행하는 더 간단하고 효율적인 방법이 있어야 할 것 같습니다.

Type type = typeof(FooBar)
BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;
type.GetConstructors(flags)
    .Where(constructor => constructor.GetParameters().Length == 0)
    .First();

type.GetConstructor(Type.EmptyTypes)

ConstructorInfo 객체 실제로 필요한 경우 Curt Hagenlocher의 답변 을 참조하십시오 .

당신이 정말로 단지에서 런타임에서 객체를 만들려고하는 경우 반면에, System.Type참조 System.Activator.CreateInstance- 그냥 장차 검증 (활성제가보다 더 많은 세부 사항을 처리 아니다 ConstructorInfo.Invoke), 또한입니다 훨씬 덜 추한.


일반 유형 매개 변수가있는 경우 Jeff Bridgman의 대답이 가장 좋습니다. 구성하려는 유형을 나타내는 Type 객체 만있는 경우 Activator.CreateInstance(Type)Alex Lyman이 제안한 것처럼 사용할 수 있지만 느리다는 말을 들었습니다 (개인적으로 프로파일 링하지는 않았습니다).

그러나 이러한 객체를 매우 자주 생성하는 경우 동적으로 컴파일 된 Linq 표현식을 사용하는보다 웅변적인 접근 방식이 있습니다.

using System;
using System.Linq.Expressions;

public static class TypeHelper
{
    public static Func<object> CreateDefaultConstructor(Type type)
    {
        NewExpression newExp = Expression.New(type);

        // Create a new lambda expression with the NewExpression as the body.
        var lambda = Expression.Lambda<Func<object>>(newExp);

        // Compile our new lambda expression.
        return lambda.Compile();
    }
}

당신에게 돌아온 대리인에게 전화하십시오. 계속해서 Linq 표현식을 다시 컴파일하는 것은 비용이 많이들 수 있기 때문에이 델리게이트를 캐시해야하지만 델리게이트를 캐시하고 매번 재사용하면 매우 빠를 수 있습니다! 개인적으로 유형별로 인덱싱 된 정적 조회 사전을 사용합니다. 이 함수는 유형 정보 만 알 수있는 직렬화 된 객체를 처리 할 때 유용합니다.

참고 : 유형이 생성 가능하지 않거나 기본 생성자가없는 경우 실패 할 수 있습니다!


클래스를 인스턴스화하기 위해 기본 생성자 만 가져오고 함수에 대한 제네릭 유형 매개 변수로 유형을 가져 오는 경우 다음을 수행 할 수 있습니다.

T NewItUp<T>() where T : new()
{
   return new T();
}

FormatterServices.GetUninitializedObject (Type) 시도하고 싶을 것입니다. 이것은 Activator.CreateInstance보다 낫습니다.

그러나이 메서드는 개체 생성자를 호출하지 않으므로 초기 값을 설정하는 경우 작동하지 않습니다. MSDN에서이 항목을 확인하십시오. http://msdn.microsoft.com/en-us/library/system.runtime .serialization.formatterservices.getuninitializedobject.aspx

여기에 또 다른 방법이 있습니다 http://www.ozcandegirmenci.com/post/2008/02/Create-object-instances-Faster-than-Reflection.aspx

그러나 객체에 매개 변수 생성자가 있으면 실패합니다.

도움이 되었기를 바랍니다

참고 URL : https://stackoverflow.com/questions/142356/most-efficient-way-to-get-default-constructor-of-a-type

반응형