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

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

Activator.CreateInstance<T>()

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

다른 방법이 있습니까?



답변

예.

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


답변

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

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

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


답변

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

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

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

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

성능 비교


답변

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

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


답변

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;
    }
}


답변