我有两个方法,一个采用对象参数,另一个采用类型为System.Web.UI.Page
的参数。我发送了一个来自System.Web.UI.Page
的类,但被调用的方法是采用object
参数的方法。
class Primitive
public object Resolve(object FromObject, Sources Source, string Expression)
{
}
public object Resolve(System.Web.UI.Page FromObject, Sources Source, string Expression)
{
}
}
我用网页调用它,其基类的基类是System.Web.UI.Page
。
但是我从这里叫它:
public Data.CompoundData<Compound<P>, P, object> Resolve(object Source)
{
Data.CompoundData<Compound<P>, P, object> functionReturnValue = default(Data.CompoundData<Compound<P>, P, object>);
functionReturnValue = new Data.CompoundData<Compound<P>, P, object>(this);
foreach (Primitive Primitive in this) {
functionReturnValue.Add(Primitive.Resolve(Source, Primitive.Source, Primitive.SourceExpression));
}
return functionReturnValue;
}
使用的变量属于object
类型的事实有所不同。我也不想过度加载这个调用函数。我该怎么做才能使这个调用函数调用正确的重载?
注意:如果我带走了具有object
签名的重载,它就可以工作(如Page的情况)。但我需要object
重载,这是一个&#34;赶上所有&#34;所有其他对象类型的重载。
感谢。
答案 0 :(得分:0)
显示更多代码,因为这对我有用
namespace WebApplicationOverload
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
OverLoad1(new Object());
OverLoad1(new Page());
OverLoad1(new MyPage()); // this call OverLoad1(Page page)
OverLoad1((Page)(new MyPage()));
}
public void OverLoad1(Object obj)
{
if (obj is Page) OverLoad1((Page)obj);
System.Diagnostics.Debug.WriteLine("Object");
}
public void OverLoad1(Page page)
{
System.Diagnostics.Debug.WriteLine("Page");
}
}
public class MyPage : System.Web.UI.Page
{
public MyPage() { }
}
}
答案 1 :(得分:0)
此代码在不使用case或if语句的情况下解决了该问题。
GetMethod
做我想要的。它将我引导到正确的重载,如果没有特定的重载存在,那么它将我引导到&#34; catch all&#34;对象超载。
它具有在更多重载中使用其他类型时不需要更新的优点;因此,它应该更容易维护。
在我的情况下,使用Reflection
的任何性能损失都是名义上的,因为我的循环总是会有少于十几次迭代。
Public Function Resolve(Source As Object) As Data.CompoundData(Of Compound(Of P), P, Object)
Resolve = New Data.CompoundData(Of Compound(Of P), P, Object)(Me)
For Each Primitive As Primitive In Me
Dim MethodInfo As System.Reflection.MethodInfo = GetType(Primitive).GetMethod("Resolve", New Type() {Source.GetType, GetType(Primitive.Sources), GetType(String)})
Resolve.Add(MethodInfo.Invoke(Primitive, New Object() {Source, Primitive.Source, Primitive.SourceExpression}))
Next
End Function