如何确定类型是否实现接口并使用该接口的成员

时间:2015-02-17 15:18:21

标签: c# interface

我正在构建一个Vector<T>类,并且我在使用Add方法时遇到了不同的问题。我已经拥有的界面使得添加成为可能,但前提是我知道T实现了IAddable<TIn, TOut>

interface IAddable<TIn, TOut>
{
    Vector<TOut> Add(Vector<TIn>)
}

partial Vector<T> where T : IAddable<T, T>
{
    public Vector<T> Add(Vector<T> v)
    {
        return mapIndexed((index, x) => this[index].Add(v[index]));
    }
}

关键是,我希望能够为实现Vector<T>的每个Vector<TIn>Vector<TOut>添加TIAddable<TIn, TOut>。我的解决方案显然无法正常工作,因为您无法拨打this[index].Add(v[index])。有没有办法在不遇到这类问题的情况下调用它?

partial Vector<T>
{
    public Vector<TOut> Add<TIn, TOut>(Vector<TIn> v)
    {
        if (typeof(T).IsAssignableFrom(typeof(IAddable<TIn, TOut>)))
            return mapIndexed((index, x) => this[index].Add(v[index]));
        return null;
    }
}

2 个答案:

答案 0 :(得分:0)

If T.GetInterface("IAddable<TIn, TOut>") != null { /* Use in vector... */ }

答案 1 :(得分:0)

实际上,这里不需要控制。 仅当Vector<T>来自Vector<T2>

时,以下内容才允许T2添加T
public interface IMyVector<T>
{
    void AddVector<TIn>(IMyVector<TIn> vector) where TIn : T;
}

public class Vector<T> : IMyVector<T>
{
    public void AddVector<TIn>(IMyVector<TIn> vector) where TIn : T
    {
        // Your logic here
    }
}

public class Base {}

public class Derived : Base {}

测试类:

public class Tests
{
    public void Test()
    {
        IMyVector<Base> baseVector= null;
        IMyVector<Derived> derivedVector= null;

        baseVector.AddVector(derivedVector);
    }
}