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

C# 扩展方法必须在非泛型静态类中定义,c#,C#,我在web表单中有以下代码: namespace TrendsTwitterati { public partial class Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { List<TweetEntity> tweetEntity = tt.GetTweetEntity(1, "")

我在web表单中有以下代码:

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;
                }
            }
        }
    }
}
命名空间TrendsTwitterati
{
公共部分类默认值:System.Web.UI.Page
{
受保护的无效页面加载(对象发送方、事件参数e)
{
List tweetEntity=tt.gettweetenty(1,“”)
.DistinctBy(e=>e.entitypiccurl);
}
公共静态IEnumerable DistinctBy(
此IEnumerable源,Func键选择器)
{
HashSet seenKeys=新HashSet();
foreach(源中的TSource元素)
{
if(seenKeys.Add(键选择器(元素)))
{
收益-收益要素;
}
}
}
}
}
当我编译这段代码时,我得到了错误

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

我的问题是

  • 我不能将这个部分类更改为static。没有它,我将如何实现同样的目标

  • 以这种方式将您的方法添加到扩展方法的
    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;
                       }
                   }
              }  
         }
    }
    
    命名空间TrendsTwitterati
    {
    公共静态类扩展
    {
    公共静态IEnumerable DistinctBy
    (此IEnumerable源,Func键选择器)
    {
    HashSet seenKeys=新HashSet();
    foreach(源中的TSource元素)
    {
    if(seenKeys.Add(键选择器(元素)))
    {
    收益-收益要素;
    }
    }
    }  
    }
    }
    
    现在使用它

    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);
              }
         }
    }
    
    命名空间TrendsTwitterati
    {
    公共部分类默认值:System.Web.UI.Page
    {
    受保护的无效页面加载(对象发送方、事件参数e)
    {
    列出tweetEntity=tt.gettweetenty(1“”).DistinctBy(e=>e.entitypecurl);
    }
    }
    }
    
    添加新的
    静态类
    并在其中定义扩展方法。查看扩展方法

     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;
                    }
                }
            }
        }
     }
    
    命名空间TrendsTwitterati
    {
    公共部分类默认值:System.Web.UI.Page
    {
    }
    公共静态类MyExtensions
    {
    公共静态IEnumerableDistinctBy(此IEnumerablesource,FunckeySelector)
    {
    HashSetseenKeys=newhashset();
    foreach(源中的TSource元素)
    {
    if(seenKeys.Add(键选择器(元素)))
    {
    产量
    返回元素;
    }
    }
    }
    }
    }
    
    创建单独的静态类,其中包含
    DistinctBy
    方法。从大括号布局判断,您的扩展方法似乎根本不在任何类中。所以这只是把它放在它自己的静态类中的问题。我将如何从page_load function调用它?@Venkat:您只需像您要扩展的类型上的任何其他实例方法一样调用它。您必须引用
    扩展
    类所在的名称空间,但您永远不必引用
    扩展
    本身。明白了吗。现在我得到一个这样的错误。错误13无法将类型“System.Collections.Generic.IEnumerable”隐式转换为“System.Collections.Generic.List”。显式转换存在(是否缺少强制转换?@Venkat add
    .ToList()
    之后是
    .DistinctBy()
    内部静态类的好技巧,但我不知道我首先看到的是尖括号和类型之间的空格。