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

时间:2017-01-02 11:39:03

标签: c# generics

在我的项目中,我使用以下类: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#中的Generic类中获取嵌套Generic类的类型?

2 个答案:

答案 0 :(得分:4)

好的泛型要求您指定所有或没有泛型参数。由于您在编译时不知道第二个参数,因此必须将它们作为参数传递给MakeGenericType

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

虽然您在编译时知道类型Transaction,但您需要通过typeof()指定,但这不应该受到伤害。

我通过is运算符验证了类型参数是按预期顺序应用的。

答案 1 :(得分:4)

我认为你必须省略第一个通用参数T并将这两个类型作为数组传递:

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