如何在C#中模仿java的通配符

时间:2015-09-01 19:31:55

标签: c# generics

我遇到如下情况:

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更为通用的动作作为参数。

PS:我发现我可以做类似的事情:

 public class Bar
 {
    public Bar Foo<T1, T2>(string id, T1 action)
        where T1 : Action<T2>
        where T2 : Container
    {

    }
 }

但这真的很难看,我期待更好的东西。你有什么想法吗?

1 个答案:

答案 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的类型,因此您不需要指定通用参数。