it-swarm.com.de

Erweiterungsmethoden müssen in einer nicht generischen statischen Klasse definiert werden

Ich erhalte den Fehler:

Erweiterungsmethoden müssen in einer nicht generischen statischen Klasse definiert werden

An der Leitung:

public class LinqHelper

Hier ist die Helper-Klasse, die auf Mark Gavells-Code basiert. Ich bin wirklich verwirrt, was dieser Fehler bedeutet, da ich sicher bin, dass es gut funktioniert hat, als ich es am Freitag verlassen habe!

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Linq.Expressions;
using System.Reflection;

/// <summary>
/// Helper methods for link
/// </summary>
public class LinqHelper
{
    public static IOrderedQueryable<T> OrderBy<T>(this IQueryable<T> source, string property)
    {
        return ApplyOrder<T>(source, property, "OrderBy");
    }
    public static IOrderedQueryable<T> OrderByDescending<T>(this IQueryable<T> source, string property)
    {
        return ApplyOrder<T>(source, property, "OrderByDescending");
    }
    public static IOrderedQueryable<T> ThenBy<T>(this IOrderedQueryable<T> source, string property)
    {
        return ApplyOrder<T>(source, property, "ThenBy");
    }
    public static IOrderedQueryable<T> ThenByDescending<T>(this IOrderedQueryable<T> source, string property)
    {
        return ApplyOrder<T>(source, property, "ThenByDescending");
    }
    static IOrderedQueryable<T> ApplyOrder<T>(IQueryable<T> source, string property, string methodName)
    {
        string[] props = property.Split('.');
        Type type = typeof(T);
        ParameterExpression arg = Expression.Parameter(type, "x");
        Expression expr = arg;
        foreach (string prop in props)
        {
            // use reflection (not ComponentModel) to mirror LINQ
            PropertyInfo pi = type.GetProperty(prop);
            expr = Expression.Property(expr, pi);
            type = pi.PropertyType;
        }
        Type delegateType = typeof(Func<,>).MakeGenericType(typeof(T), type);
        LambdaExpression lambda = Expression.Lambda(delegateType, expr, arg);

        object result = typeof(Queryable).GetMethods().Single(
                method => method.Name == methodName
                        && method.IsGenericMethodDefinition
                        && method.GetGenericArguments().Length == 2
                        && method.GetParameters().Length == 2)
                .MakeGenericMethod(typeof(T), type)
                .Invoke(null, new object[] { source, lambda });
        return (IOrderedQueryable<T>)result;
    }
}
176
Tom Gullen

veränderung 

public class LinqHelper

zu 

public static class LinqHelper

Folgende Punkte müssen beim Erstellen einer Erweiterungsmethode beachtet werden:

  1. Die Klasse, die eine Erweiterungsmethode definiert, mussnon-generic, static und non-nested sein.
  2. Jede Erweiterungsmethode muss eine static-Methode sein
  3. Der erste Parameter der Erweiterungsmethode sollte das Schlüsselwort this verwenden. 
266
crypted

Fügen Sie der Klassendeklaration das Schlüsselwort static hinzu:

// this is a non-generic static class
public static class LinqHelper
{
}
21
abatishchev

Ändern Sie es in

public static class LinqHelper
16
Rik

Versuchen Sie es zu ändern 

public class LinqHelper

zu

 public static class LinqHelper
16
Nathan

Ein Work-around für Leute, die einen Fehler wie Nathan haben:

Der fliegende Compiler scheint ein Problem mit diesem Erweiterungsmethodenfehler zu haben. Das Hinzufügen von static hat mir auch nicht weitergeholfen. 

Ich würde gerne wissen, was den Fehler verursacht?

Aber die Problemumgehung soll eine neue Erweiterungsklasse (nicht verschachtelt) sogar in dieselbe Datei schreiben und neu erstellen.

Ich dachte, dass dieser Thread genug Ansichten bekommt, die es wert ist, die begrenzte Lösung weiterzugeben, die ich gefunden habe. Die meisten Leute haben wahrscheinlich versucht, "statisch" hinzuzufügen, bevor Sie nach einer Lösung suchen! und ich habe diese Problemumgehung nirgendwo anders gesehen.

9
Stephan Luis

wenn Sie keine statischen Funktionen haben möchten, entfernen Sie einfach das Schlüsselwort "this" in den Argumenten.

4
Rohan Bhosale

Die Erweiterungsmethode sollte sich in einer statischen Klasse befinden .. Fügen Sie daher Ihre Erweiterungsmethode in einer statischen Klasse hinzu.

so sollte es zum Beispiel so sein

public static class myclass
    {
        public static Byte[] ToByteArray(this Stream stream)
        {
            Int32 length = stream.Length > Int32.MaxValue ? Int32.MaxValue : Convert.ToInt32(stream.Length);
            Byte[] buffer = new Byte[length];
            stream.Read(buffer, 0, length);
            return buffer;
        }

    }
2
Debendra Dash

Ändern Sie es in eine statische Klasse und zurück. Dies könnte dazu führen, dass sich das Studio beschwert, wenn es falsch positiv ist.

0
visc