【发布时间】:2017-04-11 20:13:50
【问题描述】:
我知道标题可能有点不清楚,所以我会解释我要做什么。
请注意,这更多是出于语言功能的教育原因。换句话说如果这是可能的,而不是应该这是解决它的方法。
考虑以下泛型类:
public class Foo<TId>
{
TId Id { get; set; }
}
现在考虑基于上述的具体子类。下面是两个使用 'int' 和 'string' 的例子...
public class IntFoo : Foo<int>
{
}
public class StrFoo : Foo<string>
{
}
最后是一个泛型,它接受一个 Foo 作为类型参数,并继承自一个从 Foo 接受其类型参数的 Laa。
public class BaseClass<TFoo, TFooId> : Laa<TFooId>
{
}
public class Laa<TFooId>
{
}
这是基于 int 和字符串的方法,但请注意,除了 IntFoo 和 StrFoo,我还必须明确定义 int 和 foo...
public class IntFinal : BaseClass<IntFoo, int>
{
char somePropSpecificToIntFinal{ get; set; }
}
public class StrFinal : BaseClass<StrFoo, string>
{
char somePropSpecificToStrFinal{ get; set; }
}
请注意,这些“最终”类是具有自己属性的具体类型,不能简化为采用类型的泛型(即使用具有单一类型 T 的泛型,然后子类化另一个采用 Foo 和T 作为它的参数。
我想知道是否有一种方法可以推断出该类型,以便可以这样编写...
public class IntFinal : BaseClass<IntFoo>
{
}
public class StrFinal : BaseClass<StrFoo>
{
}
...并具有从 Foo 指定的泛型隐含的 Laa 类型。这是我想要的伪代码示例。
public class BaseClass<TFoo> : Laa<TFoo.IdType>
{
}
那么在 C# 中可能吗?
注意,如果这不能用类来完成,可以用接口来完成吗?
考虑一下...
interface IFoo
{
Type FoosType { get; }
}
public class Foo<TId> : Foo
{
TId Id { get; set; }
Type FoosType { get{ return TId } }
}
那就这样吧……
public class BaseClass<TFoo> : Laa<TFoo.FoosType>
where TFoo : Foo
{
}
(注意:从技术上讲,FoosType 必须是静态的,并且您不能再次使用静态继承,这是伪代码。)
如果将 TFoo 限制为 IFoo,那么在定义 Laa 时是否可以使用 'FoosType' 作为类型说明符?
【问题讨论】:
-
我想我见过一些这样的实现。但不确定。
-
我认为您应该能够使用 Where 子句 (where IntFoo : Int32) 或 (where IntFoo : INumeric) 来处理这个问题 - 想法在 MSDN
-
不,我没有将其限制为数字。我正在尝试获取 Foo
使用的任何类型。为了清楚起见,我会更新问题。 -
你可以拥有最终的泛型类
public class Final<T> : BaseClass<Foo<T>, T>但是在这种情况下你应该忘记非泛型IntFoo和StrFoo并尝试以泛型方式实现它们。 -
好点,但是当您尝试简化示例时,这就是问题所在。我需要具体的 IntFoo 和 StrFoo 因为它们都有独特的属性。实际上,它们是 CategoryRow 和 ComponentRow,它们都基于 DBRow
,在这种情况下 TId 是 int,但在另一种情况下可能是 GUID。我正在构建一个基于该 ID 进行检索的缓存机制(Laa 实际上是 Cache )。