Reputation: 53
I want using class ToDataTable()
to convert List to DataTable.
Problem is: class ToDataTable()
using static
method and it make error.
I know this error but I don't know how to resolve it.
The error code is: Extension method must be defined in a non-generic static class
My code using is:
var proxyInfos = proxyL
.Where(l => l.Contains(" US "))
.Select(l => l.Split(' '))
.Select(tokens => new
{
IP = tokens[0],
Port = tokens[1]
})
.ToList();
dtProxy = ToDataTable(proxyInfos);
And class to convert List to DataTable:
public static DataTable ToDataTable<T>(this IList<T> data)
{
PropertyDescriptorCollection properties =
TypeDescriptor.GetProperties(typeof(T));
DataTable table = new DataTable();
foreach (PropertyDescriptor prop in properties)
table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType);
foreach (T item in data)
{
DataRow row = table.NewRow();
foreach (PropertyDescriptor prop in properties)
row[prop.Name] = prop.GetValue(item) ?? DBNull.Value;
table.Rows.Add(row);
}
return table;
}
I was research on the internet. Like, change my class to static.
But I change to static and error continues to appear:
Static class 'MyClass.MainForm' cannot derive from type 'System.Windows.Forms.Form'. Static classes must derive from object.
.
My code like this:
public static class MainForm : System.Windows.Forms.Form
{
}
Upvotes: 1
Views: 909
Reputation: 13381
Just remove this
public static DataTable ToDataTable<T>(IList<T> data)
and use as simple static method
Or move this function to separated static class
like
public static class UnilityExtensions
{
public static DataTable ToDataTable<T>(this IList<T> data)
{ ... }
}
Upvotes: 3
Reputation: 485
Move your method into static class, and make it extension method as per below given,
public static class Extension
{
public static DataTable ToDataTable<T>(this IList<T> data)
{
PropertyDescriptorCollection properties =
TypeDescriptor.GetProperties(typeof(T));
DataTable table = new DataTable();
foreach (PropertyDescriptor prop in properties)
table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType);
foreach (T item in data)
{
DataRow row = table.NewRow();
foreach (PropertyDescriptor prop in properties)
row[prop.Name] = prop.GetValue(item) ?? DBNull.Value;
table.Rows.Add(row);
}
return table;
}
}
and replace your line,
dtProxy = ToDataTable(proxyInfos);
with,
dtProxy = proxyInfos.ToDataTable();
Upvotes: 0
Reputation: 7903
You cant do public static class MainForm : System.Windows.Forms.Form
because you cant derive static class from another class.
Although you can do this:
using SomeNamespace
{
public static class FormExtension
{
public static DataTable ToDataTable<T>(this IList<T> data)
{
...
}
}
}
Make sure the place where you need to access the extension includes the namespace containing the Extension method. So any IList<T>
will have access to this ToDataTable<T>
method.
Upvotes: 2
Reputation: 38598
No, you cannot define a form as a static
class because it have to be instanced. TO have an extension method you need a static class, but not necessarily you need to chnage your form class. Create a new static class and put your extensions methods there. See the MSDN docs here.
Extension methods are defined as static methods but are called by using instance method syntax.
public static class MyExtensions
{
public static DataTable ToDataTable<T>(this IEnumerable<T> str)
{
PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T));
DataTable table = new DataTable();
foreach (PropertyDescriptor prop in properties)
table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType);
foreach (T item in data)
{
DataRow row = table.NewRow();
foreach (PropertyDescriptor prop in properties)
row[prop.Name] = prop.GetValue(item) ?? DBNull.Value;
table.Rows.Add(row);
}
return table;
}
}
Another suggestion, change you IList<T>
to IEnumerable<T>
because you can keep an extension method for more collections because the IEnumerable
is more abstract than IList
.
Upvotes: 2