繁体   English   中英

重载方法调用重载方法

[英]Overloaded method calling overloaded method

我有一个正在编写的方法,该方法正在其中调用另一个重载方法。 我只想编写一个外部方法,因为外部方法的参数正在传递给内部方法。 有没有办法做到这一点?

我尝试使用泛型,但对此了解不足,因此无法正常工作:

public void OuterMethod<T>(T parameter)
{
    InnerMethod(parameter); // InnerMethod accepts an int or a string
}

我知道我可以这样做:

public void OuterMethod(string parameter)
{
    InnerMethod(parameter);
}

public void OuterMethod(int parameter)
{
    InnerMethod(parameter);
}

但是我宁愿以正确的方式执行此操作,而不是复制/粘贴代码。 做到这一点的最佳方法是什么?

您可以在C ++中执行此操作,但不能在C#中执行此操作(除非inner方法也可以是泛型而不是重载)。


或者(如果您不会回答“ no”),则可以在运行时打开类型,例如...

public void OuterMethod(object parameter)
{
    if (parameter is int)
        InnerMethod((int)parameter);
    else if (parameter is string)
        InnerMethod((string)parameter);
    else
        throw new SomeKindOfException();
}

...但是显然这是运行时,而不是编译时检查。

但是我宁愿以正确的方式执行此操作,而不是复制/粘贴代码。

您也可以编写软件来编写外部方法(例如,使用System.CodeDom类),而不是手工编写它们,但这可能比其价值更大。

就像其他人说的那样,您实际上无法做您想做的事情,而您在问题中陈述的选择是最好的选择。

如果使用泛型,则实际上必须转换该值。 否则,您可以按照ChrisW的建议通过接受对象来沮丧。

 public void OuterMethod<T>(T parameter) 
            {
                T temp = parameter;
                if (temp is string )
                    InnerMethod(Convert.ToString(temp));
                if (temp is int)
                    InnerMethod(Convert.ToInt32(temp));// InnerMethod accepts an int or a string
            }

这是泛型概述的链接: http : //msdn.microsoft.com/zh-cn/library/ms172193.aspx

您可以使用dynamic类型将重载分辨率推迟到运行时。

public void OuterMethod(dynamic parameter)
{
    InnerMethod(parameter);
}

public void InnerMethod(int parameter) { }
public void InnerMethod(string parameter) { }

注意 :动态类型的 警告 表达式不能由编译器解析或检查。 而且还可能会降低性能。

从您的描述来看,这似乎是过度优化。

怎么样:

public void OuterMethod(string parameter)
{
    InnerMethod(parameter);
}

public void OuterMethod(int parameter)
{
    InnerMethod(parameter**.ToString()**);
}

如果OuterMethod始终调用InnerMethod,而InnerMethod仅接受一个int或字符串,则OuterMethod <T>没有任何意义。

如果唯一的区别是一个调用InnerMethod(int),另一个调用InnerMethod(string),则可以执行以下操作:

public void OuterMethod(string parameter)
{
    InnerMethodA(parameter);
}

public void OuterMethod(int parameter)
{
    InnerMethodA(parameter);
}

private void InnerMethodA(object parameter)
{
    // Whatever other implementation stuff goes here

    if (parameter is string)
    {
        InnerMethodB((string) parameter);
    }
    else if (parameter is int)
    {
        InnerMethodB((string) parameter);
    }
    else
    {
        throw new ArgumentException(...);
    }
}

private void InnerMethodB(string parameter)
{
    // ...
}

private void InnerMethodB(int parameter)
{
    // ...
}

好的,我也有类似的情况,这是我的业务逻辑中的一种访问控制方法。

有一个保存功能可以应用于我的任何持久层对象。

所以看起来像这样

public static Save<T>(AccessControl.User user,T entity) where T:PersistanceLayerBaseClass
{
    if(CanWrite(user, entity))
    {
        entity.save();
    }
    else
    {
        throw new Exception("Cannot Save");
    }
}

我如何在访问控制方面为某些实体提供一些自定义代码,所以我写了以下内容,它使用System.Reflection寻找一种更适合该问题的方法,“该实体可以由该用户编写吗?”

public static Boolean CanWrite<T>(AccessControl.User user, T entity) where T : PersistanceLayerBaseClass
        {
            int? clubId = null;
            MethodInfo methodInfo = entity.GetType().GetMethod("CanWrite", new Type[] { typeof(AccessControl.User), entity.GetType() });
            if(methodInfo != null)
            {
                return (Boolean)methodInfo.Invoke(null, new object[] { user, entity }) ;
            }
            else 
            {
                //generic answer
            }
            return HasRole(user.UserID, "Administrator") || (clubId.HasValue && user.MemberObject.ClubId == clubId.Value && HasRole(user.UserID, "AdministerClub"));
        }

现在,每次添加或删除方法时,只需在一个地方添加或删除方法

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM