问题描述
这是我的通用类
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
的实现,我无法确切地告诉您如何编写此代码。