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