Недавно я столкнулся с подобной проблемой («как перегрузить статические методы») и решил ее с помощью Reflection.
Вот моя ситуация:
1) public abstract class AuditObject<T> : ActiveRecordBase<T>
(да, я использую ActiveRecord) и
2) public class Employee : AuditObject<Employee>
В обоих из них я определяю некоторые статические методы, например
public static DataTable GetLookupTable(String where, Int32 topRows)
{
return doExtremelyCleverStuffToFetchData(where, topRows);
}
(в # 2 вам нужно public **new** static
, иначе вы получите предупреждение компилятора)
Как код, когда я звоню, например,
DataTable myList = AuditObject<T>.GetLookupTable("inactive = 0", 100);
... и T - Employee, статический метод не «переопределяется», т.е. выполняется метод в (1), а не (2).
Итак, в (1) я изменил статические методы (в этом примере, GetLookupTable) следующим образом:
public static DataTable GetLookupTable(String where, Int32 topRows)
{
DataTable tbl = null;
Boolean hasOverride = hasMethodOverride("GetLookupTable");
if (hasOverride)
{
tbl = invokeStaticMethod<T>(
"GetLookupTable", new Object[2] { where, topRows })
as DataTable;
}
else
{
tbl = doExtremelyCleverStuffToFetchData(where, topRows);
}
return tbl;
}
Вот как я узнаю, существует ли статический метод:
private static Boolean hasMethodOverride(String methodName)
{
var methodQuery =
from method in typeof(T).GetMethods(
BindingFlags.Static | BindingFlags.Public | BindingFlags.InvokeMethod)
where method.Name == methodName
select method;
return methodQuery.Count() > 0;
}
А вот как называется метод переопределения:
public static Object invokeStaticMethod<T>(String MethodName, Object[] Args)
{
return typeof(T).InvokeMember(MethodName,
BindingFlags.Public | BindingFlags.Static | BindingFlags.InvokeMethod,
null, null, Args);
}
Вуаля! Когда я звоню DataTable myList = AuditObject<T>.GetLookupTable("inactive = 0", 100);
T - Employee, я получаю результаты от статического метода, определенного в классе Employee.
Надеюсь, это поможет,
Димитрис