我知道标题可能有点不清楚,所以我会解释我想要做的事情。
请注意,这更多是出于教育原因围绕语言的功能。换句话说,如果这是可能的,那么应该这就是了解它的方法。
考虑以下通用类:
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和string的方法,但是除了IntFoo和StrFoo之外,我还要明确定义int和foo ......
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>
{
}
...并且从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'作为类型说明符吗?
答案 0 :(得分:0)
您无法根据C#规范执行此操作。类型推断目前仅适用于方法,并不适用于类型(类似于您的类)
违反所需结果的第二条规则是,您无法指定一个泛型类型参数并推断另一个,为方法提供全部或全部大小写。
C#规范:
1.6.3输入参数
使用泛型类时,必须为每个类型参数提供类型参数
答案 1 :(得分:-1)
您的问题不是非常具体,并且不清楚实际的约束和要求是什么。那说......
类型推断仅针对泛型方法而非泛型类型进行。所以从字面上看你的问题,答案是否定的,没有办法推断出类型。
可能对你有用的是在类定义中使用Foo<TId>
而不是IntFoo
:
class BaseClass<TFooId> : Laa<TFooId>
{
public Foo<TFooId> Method() { ... }
}
(当然,您可以在任何适当的地方应用类型:字段,属性类型等)
即。而不是使用两个类型参数对BaseClass
类型进行编码,只需使用唯一定义您正在使用的Foo<TFooId>
基类的有趣/有用元素的那个,然后使用该基类型而不是更多派生IntFoo
在您的示例中,您对TFoo
类没有约束,因此,BaseClass<TFoo, TFooId>
无论如何都能够使用Foo<TId>
中的基类型类成员。但即使您的意思是将TFoo
约束为Foo<TFooId>
,您似乎也不需要指定该类型。
如果上述内容无效,那么您需要在问题中添加更多细节,以准确解释所需内容。还要考虑一下,很可能人们已经走上了这条道路,如果你更少地表达你的问题,你需要的思考的实施机制,你可以用更高的层次来表达它,你可能会可能会发现有关Stack Overflow的现有问题或其他已解决这个更广泛问题的文章。
至少,如果您自己无法找到此类引用,那么以这种方式表达您的问题可能会更快地产生更好的答案。
另见XY Problem。