在将泛型参数约束到另一个通用接口时,是否存在"不关心"这样的事情?

Mic*_*ray 5 c# generics

我有一个接受通用参数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;
}
Run Code Online (Sandbox Code Playgroud)

但是,我们使用许多不同的IEntityDefinitions:

IEntityDefinition<SomeClass, Guid>
IEntityDefinition<SomeClass, int>
IEntityDefinition<SomeClass, double>
...etc...
Run Code Online (Sandbox Code Playgroud)

但是我的函数DefinitonPopulate根本不使用第二个泛型参数,它并不关心它是什么.但它确实需要处理我们现在和将来的所有定义.所以我似乎DefinitionPopulate无法为我们拥有的每个IEntityDefinition第二个通用参数创建一个新签名...... 除非...

问题:有什么方法可以告诉编译器我不关心第二个类型参数是什么?有点像通配符吗?

编辑:我接受了我所做的答案,因为这是我提出的问题的真实答案.但是,这个答案提供了一个很好的解决方案,也是我最终用来解决我遇到的潜在问题 - 确保你看看它!

Jcl*_*Jcl 9

我相信,在这种情况下,你应该有一个IEntityDefinition<SomeClass>接口,所有那些继承,即:

 interface IEntityDefinition<T>
 {
    void DoInterfaceMethod(T, DataReader);
 }
Run Code Online (Sandbox Code Playgroud)

然后让其余的泛型继承自那里:

 interface IEntityDefinition<T, TD> : IEntityDefinition<T>
 {
    // blablaba
 }
Run Code Online (Sandbox Code Playgroud)

如果你不能改变它,你可以为你的函数泛型添加第三个类型参数,但这是糟糕的设计,我会说.


Dav*_*nan 7

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

您可以做的最好的事情是将接口的未使用的类型参数添加到通用类型参数:

public T DefinitionPopulate<T, TD, DontCare>(IDataReader dr)
    where T: class, new()
    where TD: IEntityDefinition<T, DontCare>, new()
Run Code Online (Sandbox Code Playgroud)

这使您在编写通用代码时无需关心,但自然任何特化都需要提供该类型.