lan
lan

Reputation: 53

How to using class with static method in C#?

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

Answers (4)

Grundy
Grundy

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

Hiren Visavadiya
Hiren Visavadiya

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

Carbine
Carbine

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

Felipe Oriani
Felipe Oriani

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

Related Questions