我遇到如下情况:
public class BasicContainer {
}
public class SpecificContainerA : BasicContainer {
}
public class SpecificContainerB : BasicContainer {
}
public class BuilderA<T> where T : BasicContainer
{
public bool IsPrimary { ... }
}
public class BuilderB : BuilderA<SpecificContainer>
{
public bool IsHidden { ... }
}
public class Bar
{
public Bar Foo(string id, Action<BuilderB> action) {
}
}
换句话说,我有一个继承另一个参数化类的类并修复了这个类型参数。在我的另一个课程中,我有一个方法可以对这个课程采取行动。
是否有可能实现这样的目标:
public Action<BuilderA<T>> Bla<T>()
where T : BasicContainer
{
return c => c.IsPrimary();
}
bar.Foo("id", Bla<SpecificContainerB>());
意思是,我想给我的方法Foo
一个比T更为通用的动作作为参数。
public class Bar
{
public Bar Foo<T1, T2>(string id, T1 action)
where T1 : Action<T2>
where T2 : Container
{
}
}
但这真的很难看,我期待更好的东西。你有什么想法吗?
答案 0 :(得分:0)
Action<T>
已被密封,因此无论如何都无法从中获取。你的班级相当于:
public class Bar
{
public Bar Foo<T>(string id, Action<T> action)
where T : Container
{
}
}
或者,根据您的原始示例:
public class Bar
{
public Bar Foo<T1, T2>(string id, Action<T1> action)
where T1 : BuilderA<T2>
where T2 : Container
{
}
}
由于编译器可以从传递的动作中推断T
的类型,因此您不需要指定通用参数。