我目前正在学习和研究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;提前谢谢。
答案 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(...)