我有一个空的IContext
接口:
public interface IContext {
}
我还有两个派生接口IBasicContext
和ITypedContext
:
public interface IBasicContext : IContext {
string Id { get; }
}
public interface ITypedContext<T> : IContext {
T Value { get; }
}
我还有另一个项目,其中包含一些处理这些上下文的代码:
internal static ProcessedContext Process(this IContext context) {
if (context is IBasicContext basicContext) {
return basicContext.Process();
} else if (context.GetType().IsAssignableFrom(typeof(ITypedContext<>))){
// What do I do here??
}
}
internal static ProcessedContext Process(this IBasicContext context) {
// Do stuff here to create processed context
}
internal static ProcessedContext Process<T>(this ITypedContext<T> context) {
// Do stuff here to create processed context
}
注1:我已经检查了多个帖子。他们中的大多数人都询问是否要转换为基本的通用类,这是不我在这里试图做的事情。
注2:上下文类位于其自己的项目中。它们只是数据结构,ProcessedContext
创建代码不属于上下文项目。
注3:T
可以是我仅在运行时创建的多种类型之一。每种类型都有多个案例是令人生畏和丑陋的。 ITypedContext
的处理实际上并不关心T
。它调用了另一个通用方法。
答案 0 :(得分:1)
有什么帮助吗?
这将在运行时创建通用ProcessGeneric<T>
方法的合适版本,并使用您的ITypedContext<T>
运行时实例来调用它。
internal static ProcessedContext Process(this IContext context)
{
if (context is IBasicContext basicContext)
{
return basicContext.Process();
}
else if (context.GetType().GetInterfaces().Any(x => x.IsGenericType && x.GetGenericTypeDefinition() == typeof(ITypedContext<>)))
{
Type typedContextInterface = context.GetType().GetInterfaces().First(x => x.IsGenericType && x.GetGenericTypeDefinition() == typeof(ITypedContext<>));
MethodInfo processGenericMethod = GetType().GetTypeInfo().GetMethod(nameof(ProcessGeneric), BindingFlags.NonPublic | BindingFlags.Static).MakeGenericMethod(typedContextInterface.GetGenericArguments()[0]);
return (ProcessedContext)processGenericMethod.Invoke(null, new object[] { context });
}
}
internal static ProcessedContext ProcessGeneric<T>(ITypedContext<T> context)
{
// Do stuff here to create processed context
}