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
'Programing' 카테고리의 다른 글
OS X 10.8 업그레이드 후 Python pip가 손상됨 (0) | 2020.11.04 |
---|---|
경로 가드에 매개 변수 전달 (0) | 2020.11.04 |
WPF 명령 새로 고침 (0) | 2020.11.04 |
정밀도 수준이 다른 Date 객체 비교 (0) | 2020.11.04 |
SQL * Plus를 사용하여 Oracle 11g에서 데이터베이스를 표시하는 방법 (0) | 2020.11.04 |