扩展方法找不到类型的定义

时间:2014-02-18 21:46:56

标签: c# compiler-errors extension-methods

我使用此扩展方法收到以下编译时问题。

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; }
}

2 个答案:

答案 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;
}
相关问题