Activator.CreateInstance <T> ()에 매개 변수를 전달하는 방법


236

내가 가지고있는 일반적인 방법으로 지정하는 유형의 인스턴스를 만들고 싶습니다. 이 유형에는 여러 개의 오버로드 된 생성자가 있습니다. 생성자에 인수를 전달하고 싶지만

Activator.CreateInstance<T>()

이것을 옵션으로 사용하지 않는 것으로 보입니다.

다른 방법이 있습니까?


답변:


458

예.

(T)Activator.CreateInstance(typeof(T), param1, param2);

2
나는이 답변을 좋아한다 ;-)
frhack

16

명명 된 매개 변수를 통해 CreateInstance에 인수를 전달하는 다른 방법이 있습니다.

이를 기반으로으로 배열을 전달할 수 있습니다 CreateInstance. 이를 통해 0 개 또는 여러 개의 인수를 가질 수 있습니다.

public T CreateInstance<T>(params object[] paramArray)
{
  return (T)Activator.CreateInstance(typeof(T), args:paramArray);
}

2
이것은 불완전한 것 같습니다. 반드시 void가 아닌 T 유형의 객체를 반환해야합니까? 공개 T CreateInstance <T> (params object [] paramArray) {return (T) Activator.CreateInstance (typeof (T), 인수 : paramArray); }
wlf

11

Activator.CreateInstance에서 인수를 전달하면 매개 변수없는 작성과 비교하여 성능상의 차이가 큽니다.

사전 컴파일 된 람다를 사용하여 객체를 동적으로 생성하는 더 나은 대안이 있습니다. 물론 성능은 항상 주관적이며 가치가 있는지 여부에 따라 각 경우에 따라 다릅니다.

이 기사의 문제점에 대한 세부 사항.

그래프는 기사에서 가져 오며 1000 호출 당 소요 된 시간을 ms로 나타냅니다.

성능 비교


문맥 상,이 차트는 매개 변수화 된 생성자를 호출 할 때마다 평균적으로 동일한 하드웨어에서 (또는 3.5 마이크로 초) Activator.CreateInstance걸리는 것을 의미 0.0035ms합니다. 응용 프로그램에 따라 성능 테스트에 전혀 등록되지 않을 수도 있습니다.
다이

6

Activator.CreateInstance의 대안으로, 링크 된 URL의 FastObjectFactory는 Activator보다 우수합니다 (.NET 4.0에서와 .NET 3.5보다 훨씬 우수합니다. .NET 4.5로 수행 된 테스트 / 통계 없음). 통계, 정보 및 코드는 StackOverflow 게시물을 참조하십시오.

Activator.CreateInstance에서 ctor args를 전달하거나 IL을 사용하는 방법은 무엇입니까?


매개 변수를 전달할 때 Activator.CreateInstance보다 성능이 우수한 대체 솔루션 (링크 된)이 있음을 의미합니까? 아니면 모든 경우에 더 나은 성능을 발휘할 가능성이 있습니까?
El Zorko

1
한동안 성능 테스트를 수행하지 않았으며 누군가 .NET 4.0 통계를 게시 한 것처럼 보이지만 .NET 4.0에서는 FastObjectFactory가 더 나은 성능을 보이는 것처럼 보입니다. Activator.CreateInstance는 .NET 3.5에서 끔찍했으며 .NET 4.0에서는 상당히 빠르지 만 해당 URL에 연결된 FastObjectFactory보다 여전히 느립니다.
thames

1
public class AssemblyLoader<T>  where T:class
{
    public void(){
        var res = Load(@"C:\test\paquete.uno.dos.test.dll", "paquete.uno.dos.clasetest.dll") 
    }

    public T Load(string assemblyFile, string objectToInstantiate) 
    {
        var loaded = Activator.CreateInstanceFrom(assemblyFile, objectToInstantiate).Unwrap();

        return loaded as T;
    }
}

1
이것은 설명 할 수없는 코드 전용입니다. 나는 그것이 도움이되거나 전혀 작동하지 않는다고 의심합니다. 다른 방법으로 설득하려면 이것이 어떻게 작동하고 왜 문제를 해결해야하는지 설명하십시오.
Yunnosch
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.