在我的项目中,我使用以下类:Filter<T>.Checker<U>它还具有接口IChecker.它看起来像这样:
class Filter<T> {
public interface IChecker {
...
}
public class Checker<U> : IChecker {
...
}
List<IChecker> checkers;
...
}
Run Code Online (Sandbox Code Playgroud)
Filter类过滤T类型的对象.过滤器使用IChecker列表检查类T中的不同字段,其中U是T中此字段的类型.
在另一个类的其他方法中,我想创建一个检查器的实例.在该方法中,T的类型是Transaction,在编译时知道.U的类型仅由Type实例知道.下面的代码显示了如何通常在知道Type的情况下创建泛型类的实例.
Type type = typeof(MyObject<>).MakeGenericType(objectType);
object myObject = Activator.CreateInstance(type);
Run Code Online (Sandbox Code Playgroud)
我想更进一步,并执行以下操作:
Type type = typeof(Filter<Transaction>.Checker<>).MakeGenericType(objectType);
object myObject = Activator.CreateInstance(type);
Run Code Online (Sandbox Code Playgroud)
该部分typeof(Filter<Transaction>.Checker<>)不编译.编译器说:Unexpected use of an unbounded generic name.
是否可以在C#中的Generic类中获取嵌套Generic类的类型?
那么泛型要求您指定所有泛型参数或不指定泛型参数。由于您在编译时不知道第二个参数,因此必须将它们都作为参数传递给MakeGenericType:
Type type = typeof(Filter<>.Checker<>).MakeGenericType(typeof(Transaction), objectType);
object myObject = Activator.CreateInstance(type);
Run Code Online (Sandbox Code Playgroud)
尽管您在编译时知道类型Transaction,但需要指定 via typeof(),但这不会有什么坏处。
我通过is运算符验证类型参数是否按预期顺序应用。
| 归档时间: |
|
| 查看次数: |
899 次 |
| 最近记录: |