繁体   English   中英

C#泛型和通用约束

[英]C# Generics and Generic Constraints

我正在编写一个带有类型参数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' does not contain a definition for并且找不到mY' of type T'的扩展方法mY' of type (您是否缺少using指令或程序集引用?)

我也试图约束到多个派生类:

public class A<T> where T : E, F

但我也遇到了一个错误:

必须在任何其他约束之前列出类类型约束“F”。 考虑将类型约束移动到约束列表的开头

我试过切换它们:

public class A<T> where T : F, E

同样,结果是相同的错误,但是为E切换了F.

我正在尝试的是什么? 我究竟做错了什么?

同样,我无法改变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#没有多重继承)。 任何进一步的约束都必须是接口,或classnew() class东西

如果你真的无法改变这些课程的任何内容,那么你想要完成的任务可能是不合理的困难,据我所知。 我可以想到一些丑陋的方式(反思,或许多演员),但这不是正确的道路。 也许有一些我想念的聪明人。 如果你可以引入一个带有mY属性的接口(或一个中间类),并且让E和F继承它,那就太好了。 那么你可以将T限制在那而不是D而且一切都将是荣誉的。 否则我没有看到任何方式知道你正在处理什么样的D ,除非在运行时。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM