有没有“;don';t care”;当将一个泛型参数约束到另一个泛型接口时

本文关键字:泛型 一个 参数约束 泛型接口 另一个 don care 有没有 | 更新日期: 2023-09-27 18:21:11

我有一个函数,它接受一个需要约束到通用接口的通用参数TD。例如:

public T DefinitionPopulate<T, TD>(IDataReader dr)
    where T: class, new()
    where TD: IEntityDefinition<T, Guid>, new()
{
    T t = new T();
    TD td = new TD();
    td.DoInterfaceMethod(t, dr);
    ...
    return t;
}

然而,我们使用了许多不同的IEntityDefinitions:

IEntityDefinition<SomeClass, Guid>
IEntityDefinition<SomeClass, int>
IEntityDefinition<SomeClass, double>
...etc...

但我的函数DefinitonPopulate根本不使用第二个泛型参数,它也不在乎它是什么。但它确实需要处理所有的定义,无论是现在还是将来。因此,我似乎陷入了为DefinitionPopulate为我们现有的每一个IEntityDefinition第二个泛型参数创建新签名的困境除非

问题:有没有办法告诉编译器我不在乎第二个类型参数是什么?像通配符之类的东西?

编辑:我接受了我所做的回答,因为这是我所问问题的真实答案。然而,这个答案提供了一个很好的解决方案,也是我最终用来解决我遇到的根本问题的方法-请务必查看!

有没有“;don';t care”;当将一个泛型参数约束到另一个泛型接口时

我认为,在这种情况下,您应该有一个IEntityDefinition<SomeClass>接口,所有这些接口都从中继承,即:

 interface IEntityDefinition<T>
 {
    void DoInterfaceMethod(T, DataReader);
 }

然后让其他泛型从那里继承:

 interface IEntityDefinition<T, TD> : IEntityDefinition<T>
 {
    // blablaba
 }

如果你不能改变这一点,你可以在函数泛型中添加第三个类型参数,但我认为这是糟糕的设计。

如果不指定所有类型参数,就无法实例化泛型类型。

也许你能做的最好的事情就是将接口的未使用的类型参数添加到你的泛型类型参数中:

public T DefinitionPopulate<T, TD, DontCare>(IDataReader dr)
    where T: class, new()
    where TD: IEntityDefinition<T, DontCare>, new()

这使您在编写通用代码时不必在意,但自然任何专业都需要提供这种类型的代码。

没有通配符-您必须在定义中添加第三个通用参数,纯粹是为了实现灵活性:

public T DefinitionPopulate<T, TD,TOther>(IDataReader dr)
    where T: class, new()
    where TD: IEntityDefinition<T, TOther>, new()

在一位同事指出了一些接近的内容后,为未来的读者回答了我自己的帖子。我最初的问题与方法上的泛型类型参数有关,但如果您试图为类指定默认值,那么就有一种"某种"答案——继承。

需要明确的是,这并不是严格意义上的"默认"。它更类似于重载方法,然后调用最特定的版本,但与方法重载一样,它本质上实现了相同的结果。

例如:

public class Parent<T1, T2>() { ... }
public class Parent<T1> : Parent<T1, int> { ... }

实质上将T2参数默认为CCD_ 4。也许不是所有情况下都合适,但如果你的情况很简单,这可能是一个很好的解决方法。

相关文章: