C# 泛型和泛型约束
本文关键字:泛型 约束 | 更新日期: 2023-09-27 18:37:10
我正在编写一个带有类型参数 T 的通用抽象类 A,我打算用类 B 派生它。
A 有一个数据成员 mX,它是类 C 的一个实例,具有泛型函数。此泛型函数 GetAllOfType() 有一个类型参数 T。此类型参数被限制为第三个类 D.GetAllOfType() 搜索 D 实例的容器,其中包括 D 派生类的实例,并返回类型 T 的子集(因此约束为 D)。
类 D 本身没有特定的数据成员 int mY,但 D 的一些派生类有,例如 E 和 F。
public class D
{
}
public class E : D
{
public int mY;
}
public class F : D
{
public int mY;
}
public class C
{
public T[] GetAllOfType<T>() where T : D
{ ... }
}
public class A<T>
{
private C mX;
...
}
public class B : A<E>
{
...
}
所以这就是我的问题开始的地方:
类 B 用于继承和实现类 A 的参数类型是 D 的派生类。我正在尝试在类 A 中编写一个函数 Foo,该函数通过 GetAllOfType() 枚举并访问类型为 E、F 或任何其他具有 mY 的成员 mY。
public class A<T>
{
private C mX;
protected Foo()
{
foreach (var c in mX.GetAllOfType<T>())
{
c.mY = 0;
}
}
}
public class B : A<E>
{
public Bar()
{
Foo();
}
}
但是,问题是 GetAllOfType() 受到约束,并且我也因为不约束类 A 而收到错误。
我尝试过这样约束 A:
public class A<T> where T : D
但是我收到如下编译时错误:
键入
T' does not contain a definition for
mY',找不到 T'mY' of type
扩展方法(您是否缺少 using 指令或程序集引用?
我还尝试约束多个派生类:
public class A<T> where T : E, F
但是我也遇到了以下错误:
类类型约束"F"必须在任何其他约束之前列出。考虑将类型约束移动到约束列表的开头
我试过切换它们:
public class A<T> where T : F, E
同样,结果是相同的误差,但 F 切换为 E。
我正在尝试的可能吗?我做错了什么?
同样,我无法更改有关 C、D、E 和 F 类的任何内容。
在 A 的泛型参数上添加约束时,
public class A<T> where T : D
不出所料,你得到第二个错误的原因,Type T' does not contain a definition for mY' and no extension method mY' of typeT' could be found (are you missing a using directive or an assembly reference?)
,因为 D 没有 mY,只有派生的类 E 和 F。 原因
public class A<T> where T : E, F
不起作用是因为只能指定一个基类类型约束(C# 没有多重继承)。 任何进一步的约束都必须是接口,或者像class
或new()
如果你真的无法改变这些类的任何内容,那么据我所知,你试图完成的事情可能会非常困难。 我可以想到一些丑陋的方法(反射,或大量的选角),但这不可能是正确的道路。 也许我缺少一些聪明的东西。 如果您可以引入一个具有 mY 属性的接口(或中间类),并从中继承 E 和 F,那就太好了。 然后你可以将 T 限制为那个而不是D
,一切都会是 honkey dory。 否则,除了运行时,我看不到任何方法可以知道您正在处理哪种D
。