如何强制正确过载

时间:2015-01-20 16:26:37

标签: .net

我有两个方法,一个采用对象参数,另一个采用类型为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;所有其他对象类型的重载。

感谢。

2 个答案:

答案 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