扩展方法必须在非泛型静态类中定义 [英] Extension methods must be defined in a non-generic static class

查看:1994
本文介绍了扩展方法必须在非泛型静态类中定义的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我收到了错误:

  

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

在该行:

 公共类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('。');
        类型类型= ty​​peof运算(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
 

更新。

以下几点需要考虑创建扩展方法时:

  1. 定义的扩展方法必须是类的 非通用 静态非嵌套
  2. 在每一个扩展方法必须是一个静态方法
  3. 的扩展方法的第一个参数应该使用关键字。

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:

  1. The class which defines an extension method must be non-generic, static and non-nested
  2. Every extension method must be a static method
  3. The first parameter of the extension method should use the this keyword.

这篇关于扩展方法必须在非泛型静态类中定义的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆