无法访问通用方法

时间:2016-03-21 10:51:06

标签: c# generics

我目前正在学习和研究C#中的Generic,但我一直在努力实际使用该方法。

我试过了:

public class myTestClass
{
    class example
    {
        public static DataTable LINQtoDataTable<T>(IEnumerable<T> data)
        {
            DataTable dt = new DataTable();
            PropertyInfo[] objectProps = null; // Reflection

            if (data == null) return null;
            foreach (T record in data)
            {
                if (objectProps == null) objectProps = ((Type)data.GetType()).GetProperties();
                foreach (PropertyInfo pi in objectProps)
                {
                    Type collumnType = pi.PropertyType;
                    if ((collumnType.IsGenericType) && (collumnType.GetGenericTypeDefinition() == typeof(Nullable<>))) collumnType = collumnType.GetGenericArguments()[0];
                    dt.Columns.Add(new DataColumn(pi.Name, collumnType));
                }
            }
            return dt;
        }

    }

    example ex { get; set; }

    public myTestClass()
    {
        this.ex = new example();
    }
}

但是当我这样做时(以​​C#形式):

// Namespace area
myTestClass test;
// Main Method
test = new myTestClass();

test.LINQtoDataTable()没有出现或存在。有人可以帮帮我吗?我很困惑,为什么这不会出现,因为我公开了该方法,并将其所在的类实例化:(

非常感谢&amp;提前谢谢。

3 个答案:

答案 0 :(得分:3)

您正在尝试创建扩展方法,对于扩展方法,该方法有一些先决条件,它应该是静态的,在静态类中,您缺少的是this关键字和你的班级在开始时不是静态

public static DataTable LINQtoDataTable<T>(this IEnumerable<T> data)
{
     DataTable dt = new DataTable();
     PropertyInfo[] objectProps = null; // Reflection

     if (data == null) return null;
     foreach (T record in data)
     {
        if (objectProps == null) objectProps = ((Type)data.GetType()).GetProperties();
        foreach (PropertyInfo pi in objectProps)
        {
             Type collumnType = pi.PropertyType;
             if ((collumnType.IsGenericType) && (collumnType.GetGenericTypeDefinition() == typeof(Nullable<>))) collumnType = collumnType.GetGenericArguments()[0];
                 dt.Columns.Add(new DataColumn(pi.Name, collumnType));
        }
     }
     return dt;
}

现在您仍然可以在intellisense中看到它,因为当您尝试在IEnumerable<T>上调用时,您正在为T创建扩展方法。

为了能够调用它,您必须创建List<T>

List<myTestClass> listTestClass = new List<myTestClass>();
listTestClass.Add(new myTestClass());
listTestClass.LINQtoDataTable();

我曾写过关于扩展方法主题的博客文章,您可能想要阅读有关扩展方法的简单示例here

答案 1 :(得分:3)

静态公共类中存在extension-method,而当前代码在私有类中只有静态方法。所以你需要这个:

 public static class MyTestClass {
     public static DataTable LINQtoDataTable<T>(this IEnumerable<T> data) { ... }
 }

此外,您需要在您希望扩展方法绑定的参数上使用this - 关键字。

最后一个扩展方法不能保留在嵌套类中,你显然根本不需要它。删除嵌套类并生成MyTestClass(也考虑naming-conventions for classes)publc和static并将方法放在那里。因此,您不需要此类的任何实例。 Simpy致电myEnumerable.LINQtoDataTable()

答案 2 :(得分:2)

请问LINQtoDataTable metode是静态的,不需要example个实例。它位于ex附近,可通过其名称访问。

myTestClass.example.LINQtoDataTable(...)