在C#中获取嵌套泛型类在泛型类中的类型

9
在我的项目中,我使用以下类:Filter<T>.Checker<U>,它还具有接口IChecker。它长这样:
class Filter<T> {

    public interface IChecker {
        ...
    }

    public class Checker<U> : IChecker {
        ...
    }

    List<IChecker> checkers;

    ...

}

Filter类用于过滤T类型的对象。该过滤器使用IChecker列表来检查类T中不同字段,其中U是T中此字段的类型。

在另一个类的某些其他方法中,我想创建一个检查器实例。在该方法中,T的类型为Transaction,在编译时已知。U的类型仅由Type实例知道。下面的代码展示了如何通常使用Type创建泛型类的实例。

Type type = typeof(MyObject<>).MakeGenericType(objectType);
object myObject = Activator.CreateInstance(type);

我希望你能更进一步,完成以下内容:
Type type = typeof(Filter<Transaction>.Checker<>).MakeGenericType(objectType);
object myObject = Activator.CreateInstance(type);

typeof(Filter<Transaction>.Checker<>)这部分无法编译。编译器会提示:Unexpected use of an unbounded generic name

在C#中,是否有可能获取嵌套泛型类中的泛型类的类型?


2
除了已经发布的答案之外,它在MSDN文档中有解释。请查看整个嵌套类型部分,特别是:“要从嵌套类型的通用类型定义构造通用类型,请使用通过连接所有封闭类型的类型参数数组形成的数组调用MakeGenericType方法,从最外层的通用类型开始,并以嵌套类型本身的类型参数数组结束,如果它具有自己的类型参数。” - MarcinJuraszek
2个回答

4

泛型要求你在编译时全部指定泛型参数,而且必须全部指定。由于你不知道第二个参数的值,所以你需要将两个参数一起作为参数传递给 MakeGenericType 方法:

Type type = typeof(Filter<>.Checker<>).MakeGenericType(typeof(Transaction), objectType);
object myObject = Activator.CreateInstance(type);

尽管您在编译时知道类型Transaction,但需要通过typeof()指定,但这不会有影响。我通过is运算符验证了类型参数按预期顺序应用。

4

我认为你需要省略第一个泛型参数T,而是将两种类型作为数组传递:

Type type = typeof(Filter<>.Checker<>).MakeGenericType(typeof(Transaction),objectType);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接