必须在非泛型静态类中定义扩展方法

时间:2015-08-18 06:14:40

标签: c#

我在网络表单中有这个代码:

namespace TrendsTwitterati
{
    public partial class Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            List<TweetEntity> tweetEntity = tt.GetTweetEntity(1, "")
                .DistinctBy(e => e.EntityPicURL);
        }

        public static IEnumerable<TSource> DistinctBy<TSource, TKey>(
            this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
        {
            HashSet<TKey> seenKeys = new HashSet<TKey>();
            foreach (TSource element in source)
            {
                if (seenKeys.Add(keySelector(element)))
                {
                    yield return element;
                }
            }
        }
    }
}

编译此代码时,我收到错误

  

扩展方法必须在非泛型静态类中定义。

我的问题是

  1. 我无法将此分类更改为静态。没有它,我将如何做到这一点?

2 个答案:

答案 0 :(得分:4)

添加新的static类并在其中定义扩展方法。查看MSDN documentation的扩展方法。

 namespace TrendsTwitterati 
 {
    public partial class Default: System.Web.UI.Page
    {

    }

    public static class MyExtensions 
    {
        public static IEnumerable < TSource > DistinctBy < TSource, TKey > (this IEnumerable < TSource > source, Func < TSource, TKey > keySelector) 
        {
            HashSet < TKey > seenKeys = new HashSet < TKey > ();
            foreach(TSource element in source) 
            {
                if (seenKeys.Add(keySelector(element)))
                {
                    yield
                    return element;
                }
            }
        }
    }
 }

答案 1 :(得分:3)

以这种方式将您的方法添加到static类中以获取扩展方法

namespace TrendsTwitterati
{
    public static class Extension
    {
        public static IEnumerable<TSource> DistinctBy<TSource, TKey>
          (this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
          {
               HashSet<TKey> seenKeys = new HashSet<TKey>();
               foreach (TSource element in source)
               {
                   if (seenKeys.Add(keySelector(element)))
                   {
                       yield return element;
                   }
               }
          }  
     }
}

现在使用它

namespace TrendsTwitterati
{
     public partial class Default : System.Web.UI.Page
     {
          protected void Page_Load(object sender, EventArgs e)
          {
               List<TweetEntity> tweetEntity = tt.GetTweetEntity(1, "").DistinctBy(e => e.EntityPicURL);
          }
     }
}