我前段時間遇到類似的問題(「如何重載靜態方法」),我用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是僱員,靜態方法不是「被覆蓋的」,即所執行的一個是在方法(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類中定義的靜態方法獲得結果。
希望這有助於
季米特里斯
這是什麼語言? – 2009-09-01 03:18:50
對不起,它的C#。忘了添加到標題。 – MrLane 2009-09-01 03:19:46