在派生的泛型实例上调用静态扩展方法

时间:2018-08-29 17:27:41

标签: c# .net

我有一个空的IContext接口:

public interface IContext {
}

我还有两个派生接口IBasicContextITypedContext

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。它调用了另一个通用方法。

1 个答案:

答案 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
}