我有一个用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操作的详细信息需要更改,则只需在一个位置进行更改。
答案 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>
将是微不足道的)