C# 如何为<;动态传递类型;T>;

C# 如何为<;动态传递类型;T>;,c#,C#,可能重复: 我该如何做下面这样的事情? historyType不是Adapt中公认的类型 Type historyType = Type.GetType("Domain.MainBoundedContext.CALMModule.Aggregates.LocationAgg." + modifiedEntry.GetType().Name + "History"); ServiceLocationHistory history = adapter.Adapt<ServiceLocati

可能重复:

我该如何做下面这样的事情? historyType不是Adapt中公认的类型

Type historyType = Type.GetType("Domain.MainBoundedContext.CALMModule.Aggregates.LocationAgg." + modifiedEntry.GetType().Name + "History");

ServiceLocationHistory history = adapter.Adapt<ServiceLocation, historyType>(modifiedEntry as ServiceLocation);
historyRepository.Add(history);

这可能是您的选项,也可能不是,但您可以始终使用DynamicMethod并发出IL来创建您的类型并返回
ServiceLocationHistory
。我经常这样做,而不是黑客反射技巧,它几乎总是更快

否则,通过反射,您可以执行以下操作:

ServiceLocationHistory history = adapter.GetType()
                                        .GetMethod("Adapt")
                                        .MakeGenericMethod(typeof(ServiceLocation), historyType)
                                        .Invoke(adapter, new [] {modifiedEntry})
                                         as ServiceLocationHistory;

请注意,重复的问题包含Marc Gravell的“为什么你不应该那样做”以及“如果我需要怎么做”。
ServiceLocationHistory history = adapter.GetType()
                                        .GetMethod("Adapt")
                                        .MakeGenericMethod(typeof(ServiceLocation), historyType)
                                        .Invoke(adapter, new [] {modifiedEntry})
                                         as ServiceLocationHistory;