2015-08-18 10 views
5

ho questo codice in moduli web:metodo di estensione deve essere definito in una classe statica non generico

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

Quando compilo questo codice ottengo l'errore

metodo di estensione deve essere definito in una classe statica non generica.

La mia domanda è

  1. Non posso cambiare questa classe parziale statica. Come realizzerò lo stesso senza di esso?
+2

Creare una classe statica separata con il metodo 'DistinctBy'. –

+2

A giudicare dal layout della controventatura sembrerebbe che il tuo metodo di estensione non sia affatto in nessuna classe. Quindi è solo questione di metterlo nella sua classe statica. – BoltClock

risposta

6

Aggiungi nuova static classe e definire i vostri metodi di estensione al suo interno. Controlla MSDN documentation per i metodi di estensione.

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

Bel trucco con la classe statica interna, ma non avevo idea di cosa stavo guardando in un primo momento con gli spazi tra le parentesi angolari e i tipi. –

+1

ha funzionato grazie – Venkat

5

Aggiungi il tuo metodo in static classe per il metodo di estensione in questo modo

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

Ora lo usano

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); 
      } 
    } 
} 
+0

Come chiamerò questo dalla funzione page_load? – Venkat

+1

@Venkat: lo chiami come qualsiasi altro metodo di istanza sul tipo che stai estendendo. Devi fare riferimento allo spazio dei nomi in cui risiede la classe 'Extension', ma non devi mai fare riferimento a' Extension' stessa. – BoltClock

+0

capito. Ora ho un errore in questo modo. Errore Impossibile convertire implicitamente il tipo 'System.Collections.Generic.IEnumerable ' in 'System.Collections.Generic.List '. Esiste una conversione esplicita (ti manca un cast?) – Venkat

Problemi correlati