带有索引器的类不是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
答案 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
。也就是说,如果你真的想要创建一些可以完成数组所能做的事情。试着确保这是你想要做的任何事情的最佳方式。