我知道标题可能有点不清楚,所以我会解释我正在尝试做什么。是否可以使用/提取泛型使用的类型来定义第二个泛型的类型?
请注意,这是围绕语言的功能更多的教育原因。换句话说如果这是可能的,而不是应该这是要走的路。
考虑下面的通用类:
public class Foo<TId>
{
TId Id { get; set; }
}
现在基于上述考虑具体子类。这里有两个例子使用“廉政”和“串” ......
public class IntFoo : Foo<int>
{
}
public class StrFoo : Foo<string>
{
}
最后一个通用的,需要一个富作为一个类型参数,并从左心耳这需要从富的类型参数继承。
public class BaseClass<TFoo, TFooId> : Laa<TFooId>
{
}
public class Laa<TFooId>
{
}
这里是你会怎么做基于一个int和字符串的一个,但除了IntFoo和StrFoo注意,我也必须定义int和富明确...
public class IntFinal : BaseClass<IntFoo, int>
{
char somePropSpecificToIntFinal{ get; set; }
}
public class StrFinal : BaseClass<StrFoo, string>
{
char somePropSpecificToStrFinal{ get; set; }
}
请注意,这些'final'类是具有自己的属性的具体类型,不能简化为需要类型的泛型(即使用泛型与单个类型T,然后子类化另一个通用Foo和T作为其论据。
我不知道是如果有办法有该类型推断所以它可以写成这样的...
public class IntFinal : BaseClass<IntFoo>
{
}
public class StrFinal : BaseClass<StrFoo>
{
}
...并有从富指定的通用隐含左心耳类型。这是我想要的一个伪代码示例。
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'作为类型说明符吗?
我想我已经看到了一些这样的实现。但不确定。 – Prajwal
我想你应该能够处理这与Where子句(其中IntFoo:Int32)或(其中IntFoo:INumeric) - 想法是[MSDN](https://msdn.microsoft.com/cs-cz/library/ bb384067%28v = vs.100%29.aspx?f = 255&MSPPError = -2147217396) – Tatranskymedved
不,我不会将其限制为数字。我试图得到任何类型的Foo正在使用。为了清楚起见,我会更新这个问题。 –
MarqueIV