检查对象是否实现了泛型<t>的接口,其中泛型类型是T </t>的子级

时间:2013-02-19 18:56:24

标签: c# generics inheritance

我正在尝试检查给定对象是否实现了我接受通用参数的接口。

public interface ICaseCopier<T> where T : ModelElement 
{
    T Case1 { get; set; }
    T Case2 { get; set; }

    void CopyCase(T caseToCopy, T copiedCase);
}

我的一个对象实现了这样的界面:

public class ProcessLoad : ElectricalLoad, ICaseCopier<ProcessCase>

其中ProcessCase是ModelElement的子级。我有许多对象在泛型中使用具有不同参数的接口,因此逐个检查它们是不可能的。

我试过的是:

ICaseCopier<ModelElement> copier = this as ICaseCopier<ProcessCase>;

但是我收到以下错误:

Cannot convert source type 'ICaseCopier<ProcessCase>' to target type 'ICaseCopier<ModelElement>'

ProcessCase可以转换为ModelElement。

1 个答案:

答案 0 :(得分:5)

您无法执行此操作,因为转换不安全 - 如果您可以执行以下操作:

public class OtherElement : ModelElement { }

ICaseCopier<ModelElement> copier = this as ICaseCopier<ProcessCase>;
copier.Case1 = new OtherElement();

唯一可以做到这一点的方法是使ICaseCopier<T>接口协变,当前T出现在输入和输出位置时,您无法以当前形式执行此操作。