我前段时间遇到类似的问题(“如何重载静态方法”),我用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