通用方法将此转换为T

时间:2014-05-27 20:07:43

标签: c# generics

我有这个班级

class A
{
    public string OnlyOnA { get; private set; }

    public virtual void Accept<T>(ITaker<T> ia) where T : A
    {
        ia.Take((T)this);
    }
}

和这个界面

interface ITaker<T> where T : A
{
    void Take(T a);
}

有了这个我可以像下面的

那样继承A
class B : A
{
    public string OnlyOnB { get; private set; }    
}

并实现界面

class BTaker : ITaker<B>
{
    public void Take(B b)
    {
        var v = b.OnlyOnB;
    }
}

我在Taker类中获得灵活性以获得A的正确类型和A的子类型。 但是我仍然需要A中的演员,我必须做(T)这个;

我该如何避免演员?

非常感谢。

1 个答案:

答案 0 :(得分:3)

您要做的事情是不安全的,因为您可以这样做:

new A().Accept(new BTaker());

为了确保安全,您可以创建一个新界面来指定可以接受的T类型。

interface IAccept<T> where T : A
{
    void Accept(ITaker<T> taker);
}

class A : IAccept<A>
{
    public string OnlyOnA { get; private set; }

    public virtual void Accept(ITaker<A> ia)
    {
        ia.Take(this);
    }
}