具有未指定类型的泛型类的属性

时间:2019-09-11 14:12:30

标签: c# generics

我有一个带有两个类型参数的泛型类componentDidMount

SomeClass

然后我有一个带有一个类型参数的通用类public class SomeClass<T, U> where T : IFoo where U : IBar { public void SomeMethod(T t) { /* ... */ } } 。在这个课程中,我想拥有一个SomeOtherClass的属性。对于此属性,我只想让SomeClass的第一个类型参数与SomeClass的类型参数匹配,而我不在乎第二个类型参数。所以我想做的是像

SomeOtherClass

但是显然不能编译。甚至可以做到吗?

2 个答案:

答案 0 :(得分:3)

我认为唯一可行的方法是定义IBar的实现,该实现不执行任何操作并使用它。

public class NullBar: IBar
{
   // whatever no-op implementation that makes sense
}

public class SomeOtherClass<T>
     where T : IFoo
{
     public SomeClass<T, NullBar> Frob { get; set; }
}

答案 1 :(得分:2)

public class SomeClass<T, U>
    where T : IFoo
    where U : IBar
{
    public void SomeMethod(T t) { /* ... */ }
}

我注意到的第一件事是,如果您不需要'U',我就不会约束U。这只会使实现变得混乱,并使事情变得更加困难。

第二点是,我认为您不能具有隐式隐含的泛型属性,但是您绝对可以使用方法来做到这一点。

public class SomeOtherClass<T>
    where T : IFoo
{
    public SomeClass<T, U> Frob { get; set; }
}

成为(使用抽象类忽略实现细节)

public abstract class SomeOtherClass<T>
    where T : IFoo
{
    public abstract SomeClass<T, U> Frob<U>(U parameter);
}

除非有歧义,否则无需指定“ U”通用参数。无论您通过什么参数作为参数,都将隐含“ U”。

如果这不符合您的需求,我想到的另一件事是通过子类默认U泛型:

public class SomeOtherClass<T, U>
    where T : IFoo
    where U : IBar
{
    public SomeClass<T, U> Frob { get; set; }
}

public class SomeOtherClass<T> : SomeOtherClass<T, IBar>
    where T : IFoo
{
}

否则,一个接口就足够了(这可能是我的建议是在此级别将其默认设置)...

public class SomeOtherClass<T>
    where T : IFoo
{
    public SomeClass<T, IBar> Frob { get; set; }
}