Saya mendapatkan kesalahan:
Metode ekstensi harus didefinisikan dalam kelas statis non-generik
Di telepon:
public class LinqHelper
Ini adalah kelas pembantu, berdasarkan pada kode Mark Gavells. Saya benar-benar bingung apa artinya kesalahan ini karena saya yakin itu berfungsi dengan baik ketika saya meninggalkannya pada hari Jumat!
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;
}
}
c#
.net
linq
extension-methods
compiler-errors
Tom Gullen
sumber
sumber
public static class IQueryable<T> where T : MyBaseClass
yang juga menghasilkan kesalahan ini. Thewhere T : MyBaseClass
frase milik pada metode individu tanpa<T>
di kelas statis.this
argumen metode.jika Anda tidak berniat memiliki fungsi statis, singkirkan saja kata kunci "ini" dalam argumen.
sumber
this
kata kunci yang terkubur di dalam tanda tangan metode saya. Menghapusnya menghapus kesalahan.Tambahkan kata kunci
static
ke deklarasi kelas:sumber
Coba ubah
untuk
sumber
Ubah ke
sumber
Solusi untuk orang-orang yang mengalami bug seperti Nathan:
Kompilator on-the-fly tampaknya memiliki masalah dengan kesalahan Metode Ekstensi ini ... menambahkan
static
tidak membantu saya juga.Saya ingin tahu apa yang menyebabkan bug?
Tetapi yang perlu dilakukan adalah menulis kelas Extension baru (tidak bersarang) bahkan dalam file yang sama dan membangun kembali.
Berpikir bahwa utas ini mendapatkan pandangan yang cukup sehingga layak diteruskan (terbatas) solusi yang saya temukan. Kebanyakan orang mungkin mencoba menambahkan 'statis' sebelum mencari solusi! dan saya tidak melihat perbaikan di sekitar ini di tempat lain.
sumber
Metode ekstensi harus di dalam kelas statis. Jadi tolong tambahkan metode ekstensi Anda di dalam kelas statis.
jadi misalnya harus seperti ini
sumber
Coba ubah ke kelas statis dan kembali. Itu mungkin menyelesaikan pengaduan visual studio ketika itu positif palsu.
sumber
Saya mengalami masalah serupa, saya membuat folder 'foo' dan membuat "class" di dalam foo, lalu saya mendapatkan kesalahan yang disebutkan di atas. Salah satu perbaikannya adalah menambahkan "statis" seperti yang disebutkan sebelumnya ke kelas yang akan menjadi "kelas statis publik LinqHelper".
Asumsi saya adalah bahwa ketika Anda membuat kelas di dalam folder foo menganggapnya sebagai kelas ekstensi, maka aturan antara lain berikut berlaku untuk itu:
1) Setiap metode ekstensi harus berupa metode statis
WORKAROUND Jika Anda tidak ingin statis. Solusi saya adalah membuat kelas langsung di bawah namespace dan kemudian seret ke folder "foo".
sumber