6

我有一个接受泛型参数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;
}

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

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

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

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

编辑:我接受了我所做的答案,因为这是我所问问题的真实答案。但是,这个答案提供了一个很好的解决方案,并且是我最终用来解决我遇到的潜在问题的方法 - 请务必检查一下!

4

4 回答 4

9

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

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

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

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

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

于 2013-07-05T06:09:42.790 回答
7

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

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

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

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

于 2013-07-05T06:08:25.137 回答
3

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

public T DefinitionPopulate<T, TD,TOther>(IDataReader dr)
    where T: class, new()
    where TD: IEntityDefinition<T, TOther>, new()
于 2013-07-05T06:08:55.503 回答
0

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

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

例如:

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

本质上将 T2 参数默认为int. 也许并非在所有情况下都适用,但如果您的情况很简单,这可能是一个很好的解决方法。

于 2013-07-16T01:57:02.403 回答