为什么在使用 IEnumerator 类列表时无法在扩展方法中访问类方法

问题描述

这是我的通用类

public class CustomClass<T>
    {
        public T Data { set; get; }
        public T getData()
        {
            return Data;
        }
    }

这是我的主要方法

static void Main(string[] args)
        {
            mylist = new List<CustomClass<int>>();
            CustomClass<int> customClass = new CustomClass<int>();
            customClass.Data = 10;
            CustomClass<int> customClass1 = new CustomClass<int>();
            customClass1.Data = 10;
            mylist.Add(customClass);
            mylist.Add(customClass1);
            CustomClass<int> custom = new CustomClass<int>();
            custom.Data = 20;
            mylist.Add(custom);
            Console.WriteLine(mylist[0].getData());
            Console.WriteLine("----------All----------");
            Console.WriteLine(value: mylist.CustomAll('%',3,AllAny));
            }

这是我想接收自定义类数据但显示错误的扩展

public static class CustomOperation
    {

        public static bool CustomAll<T>(this IEnumerable<T> e,char symbol,int compare,Action<List<T>,int,char,bool> func)
        {
            e[0].Data// Error here I want CustomClass Data
            return true;
        }

解决方法

请注意,您的扩展方法也可用于 List<string>List<string>(实际上是任何类型的 List):

// This compiles!
var intList = new List<int> {1,2,3};
intList.CustomAll('a',(a,b,c,d) => {});

e[0] 那么将是 int,那么 e[0].Data 会是什么? int 没有名为 Data 的成员!

这不是唯一的问题,它也可以在任何 IEnumerable 上使用。并非所有 IEnumerable 都可以用 int 编入索引,因此 e[0] 并不总是有意义。

这就是为什么你的代码没有多大意义。如果您希望 IList<CustomClass<T>> 成为 IList<CustomClass<int>>,您需要将其限制为仅适用于 Data,或者更具体地说,int

public static bool CustomAll<T>(this IList<CustomClass<T>> e,char symbol,int compare,Action<List<CustomClass<T>>,int,char,bool> func)
// or
public static bool CustomAll(this IList<CustomClass<int>> e,Action<List<CustomClass<int>>,bool> func)

如果您希望它适用于所有 IEnumerable<CustomClass<T>>,那么您需要使用 e.First() 而不是 e[0](除其他外)。如果不了解 CustomAll 的实现,我无法确切地告诉您如何编写此代码。