实现多个类共有的静态方法

时间:2014-09-30 06:43:06

标签: c# sql static-methods

我有一个用C#编写的WinForms应用程序,它有很多自定义类。 其中许多Clases共享类似的属性和方法,我已经能够通过使用继承来减少编码。 但是,我的类也有很多类似的静态方法(通常,Classes之间唯一不同的实现是对类本身的引用。这可能是一个非常愚蠢的例子 -

public class MyClass1()
{
    public string IdentifyYourself()
    {
        return "This is the IdentifyYourself method in " + typeof(MyClass1).Name;
    }
}

public class MyClass2()
{
    public string IdentifyYourself()
    {
        return "This is the IdentifyYourself method in " + typeof(MyClass2).Name;
    }
}

有没有办法在IdentifyYourself()方法中推广代码,这样就不需要在每个实现中重复使用Class了?

如果这些不是静态方法,那么我可以做类似的事情

this.GetType().Name;

但当然,'this'关键字在静态方法中不可用。

您可能想知道为什么这些必须是静态方法。但是上面的例子不是我的实际代码,而是我所遇问题的简化版本。我的代码中的一个实际例子(但仍然是一个较短的例子)如下 -

public static DataTable List(bool active = true)
    {
        try
        {
            string table = typeof(MyClass).Name;
            string sqlText = "SELECT * FROM [" + table + "] WHERE Active = @Active;";
            SqlCommand sqlCom = new SqlCommand(sqlText);
            sqlCom.Parameters.AddWithValue("@Active", active);
            DataTable results = Express.GetTable(sqlCom);
            return results;
        }
        catch (Exception eX)
        {
            ...
        }
    }

List()实现的代码在第一行

中从一个类到下一个类不同
string table = typeof(MyClass).Name;

我在想如果我能以某种方式概括这一点,我可以重新考虑代码如下 -

public static DataTable List(bool active = true)
        {
            try
            {
                string nameOfClass = //...some generalized way of obtained the Name of the class...//
                return UtilityClass.List(nameOfClass);
            }
            ...
        }

每次我想在一个新类中实现它时,只需几行代码即可直接复制和粘贴,所有更详细的代码都可以放在Utility类中。这样做的好处不仅在于避免在每个实现中键入每个Class的名称,而且如果SQL操作的详细信息需要更改,则只需在一个位置进行更改。

1 个答案:

答案 0 :(得分:3)

这样做的经典方法是泛型:

public static DataTable List<T>(bool active = true)
{
    try
    {
        string table = typeof(T).Name;
        // ...
    } ....

var table = YourStaticClass.List<MyClass1>();

但是,坦率地说,我还建议让它返回List<T>而不是DataTable。这取决于Express是什么(但是:&#34; dapper&#34;用于查询List<T>将是微不足道的)