扩展方法必须在非泛型静态类中定义 [英] Extension methods must be defined in a non-generic static class
本文介绍了扩展方法必须在非泛型静态类中定义的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我收到了错误:
扩展方法必须在非泛型静态类中定义
在该行:
公共类LinqHelper
下面是辅助类的基础上,马克Gavells code。我真的很困惑,这是什么错误意味着,因为我相信这是我离开的时候它在星期五做工精细!
使用系统;
使用System.Collections.Generic;
使用System.Linq的;
使用的System.Web;
使用System.Linq.Ex pressions;
使用的System.Reflection;
///<总结>
///辅助方法链接
///< /总结>
公共类LinqHelper
{
公共静态IOrderedQueryable< T>排序依据< T>(这IQueryable的< T>源,字符串属性)
{
返回ApplyOrder< T>(源,属性,排序依据);
}
公共静态IOrderedQueryable< T> OrderByDescending< T>(这IQueryable的< T>源,字符串属性)
{
返回ApplyOrder< T>(源,属性,OrderByDescending);
}
公共静态IOrderedQueryable< T> ThenBy< T>(这IOrderedQueryable< T>源,字符串属性)
{
返回ApplyOrder< T>(源,属性,ThenBy);
}
公共静态IOrderedQueryable< T> ThenByDescending< T>(这IOrderedQueryable< T>源,字符串属性)
{
返回ApplyOrder< T>(源,属性,ThenByDescending);
}
静态IOrderedQueryable< T> ApplyOrder< T>(IQueryable的< T>源,字符串属性,字符串方法名)
{
字符串[]道具= property.Split('。');
类型类型= typeof运算(T);
ParameterEx pression精氨酸=实施例pression.Parameter(类型,×);
防爆pression EXPR = ARG;
的foreach(在道具串道具)
{
//使用反射(不ComponentModel),以反映LINQ
的PropertyInfo PI = type.GetProperty(支撑);
EXPR =前pression.Property(表达式,PI);
TYPE = pi.PropertyType;
}
键入delegateType = typeof运算(Func键<,>)MakeGenericType(typeof运算(T),类型)。
LambdaEx pression波长=前pression.Lambda(delegateType,EXPR,ARG);
对象result = typeof运算(可查询).GetMethods()。单(
方法=> method.Name ==方法名
&功放;&安培; method.IsGenericMethodDefinition
&功放;&安培; method.GetGenericArguments()。长度== 2
&功放;&安培; method.GetParameters()。长度== 2)
.MakeGenericMethod(typeof运算(T),类型)
.Invoke(空,新的对象[] {源,拉姆达});
返回(IOrderedQueryable< T>)的结果;
}
}
解决方案
变更
公共类LinqHelper
到
公共静态类LinqHelper
更新。
以下几点需要考虑创建扩展方法时:
- 定义的扩展方法必须是类的
非通用
的静态
和非嵌套
- 在每一个扩展方法必须是一个
静态
方法 - 的扩展方法的第一个参数应该使用
这
关键字。
I'm getting the error:
Extension methods must be defined in a non-generic static class
On the line:
public class LinqHelper
Here is the helper class, based on Mark Gavells code. I'm really confused as to what this error means as I am sure it was working fine when I left it on Friday!
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;
}
}
解决方案
change
public class LinqHelper
to
public static class LinqHelper
Update.
The following points need to be considered when creating an extension method:
- The class which defines an extension method must be
non-generic
,static
andnon-nested
- Every extension method must be a
static
method - The first parameter of the extension method should use the
this
keyword.
这篇关于扩展方法必须在非泛型静态类中定义的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文