如何使一个类充当数组?

时间:2018-05-19 01:52:41

标签: c# arrays

带有索引器的类不是import sched import app import time seconds = int(input()) sc = sched.scheduler(time.time, time.sleep) sc.enter(seconds, 1, app.run, (sc,)) sc.run() 。但我想像数组一样使用我的实现。例如,访问扩展方法。

有没有办法实现这个目标?

System.Array

3 个答案:

答案 0 :(得分:2)

MyArray使用泛型,因此您的扩展方法也需要使用泛型。

public class MyArray<T>
{
    private T[] _array;

    public MyArray(int size)
    {
        _array = new T[size];
    }

    public T this[int index]
    {
        get { return _array[index]; }
        set { _array[index] = value; }
    }
}

public static class ArrayExtensions
{
    public static void Foo<T>(this MyArray<T> myArray)
    {
        // ..
    }
}

public class ArrayUser
{
    public ArrayUser()
    {
        var a = new MyArray<int>(10);
        a.Foo(); // does not compile, Foo() is unknown
    }
}

答案 1 :(得分:1)

你不能愚弄CLR和运行时认为你的类型是一个数组。你只能在语法上使它看起来有限制,你也可以实现更多struct,但这将是一个痛苦。无论如何,正如您所发现的那样,扩展方法无法正常工作。您必须使用以下

public static void Foo<T>(this MyArray<T> myArray)

如果您另有要求,也许可以重新考虑您的可能和共同的东西以及它的直观可维护性

答案 2 :(得分:1)

如果你想要Arrays的扩展方法,你可以做的最好是:

public class MyArray<T> : IEnumerable<T>, IList<T>, ICollection<T>, IList, ICollection, 
                          IEnumerable, IStructuralComparable, IStructuralEquatable,
                          IReadOnlyList<T>, IReadOnlyCollection<T>
{
    // Do stuff
}

这些是System.Array实现的所有接口,因此对这些类型的任何扩展方法都会延续到您的类型。虽然这是一个很好的数额,如果有人在哪里这样做:

public static class ArrayExt
{
    public static void Foo<T>(this T[] array) { ... }
}

根本无法让Foo<>为您的班级工作。没有。正如已经提到的@TheGeneral,你将无法欺骗CLR和运行时认为你的类型是一个数组。

最好的方法是通过实现System.Array实现的接口,然后实现这些MSDN扩展方法来获得类似的接口:

AsParellel();
AsQueryable();
Cast<TResult>();
OfType<TResult>();

总的来说,您正在查看需要重新创建的大约75种方法,而且还有一些您忘记的其他属性,例如IsSynchronized。也就是说,如果你真的想要创建一些可以完成数组所能做的事情。试着确保这是你想要做的任何事情的最佳方式。