我使用此扩展方法收到以下编译时问题。
error CS1061: 'SomeClass' does not contain a definition for 'SomeProperty' and
no extension method 'SomeProperty' accepting a first argument of type 'SomeClass' could be found (are
you missing a using directive or an assembly reference?)
这些类都在同一个项目中,看起来我可以毫无问题地声明该类。我该如何解决这个问题?
using System;
using System.Collections;
using System.Collections.Generic;
public static class SomeClassListEx
{
public static List<SomeClass> SomeMethod<SomeClass>(this IEnumerable<SomeClass> list, int id) // where T : SomeClass
{
List<SomeClass> result = new List<SomeClass> ();
foreach (SomeClass something in list)
{
if(something.SomeProperty.SomeList.Contains(id))
{
result.Add (something);
}
}
return result;
}
}
public abstract class SomeClass : IEquatable<SomeClass>
{
public SomethingElse SomeProperty { get; set; }
}
public interface SomethingElse
{
List<int> SomeList { get; }
}
答案 0 :(得分:2)
您的方法是通用的,因此在SomeMethod<SomeClass>
SomeClass
不再是您的类之后,它是一个通用参数,当您实际调用该方法时,它可以被任何内容替换。
您的扩展方法不应该是通用的:
public static List<SomeClass> SomeMethod(this IEnumerable<SomeClass> list, int id)
{
List<SomeClass> result = new List<SomeClass> ();
foreach (SomeClass something in list)
{
if(something.SomeProperty.SomeList.Contains(id))
{
result.Add (something);
}
}
return result;
}
答案 1 :(得分:1)
除了@ MarcinJuraszek的答案之外,我想说如果你想让你的各种子类通用,它们来自abstract
类SomeClass,你可以这样做:
注意我在这里使用泛型参数T,并添加您在代码中注释掉的泛型约束where T : SomeClass
。这是令人困惑的,因为您使用的是同一个类的名称作为通用参数名称;这是不允许的。
public static List<T> SomeMethod<T>(this IEnumerable<T> list, int id) where T : SomeClass
{
List<T> result = new List<T>();
foreach (T something in list)
{
if (something.SomeProperty.SomeList.Contains(id))
{
result.Add(something);
}
}
return result;
}