2009-01-07 90 views
3

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

我尝试使用仿制药,但我不知道有足够的了解这个所以它不工作:

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); 
} 

但我d而不是复制/粘贴代码,而是采用正确的方式。什么是实现这一目标的最佳方式?

回答

4

你可以在C++中做到这一点,但不是在C#中(除非内部方法也可以是泛型而不是重载)。


或者(如果你不接受“不”的回答),你可以做类型运行时开关,例如像...

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类),而不是手动编写它们,但这可能比它的价值更麻烦。

0

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

如果唯一的区别是,一个叫InnerMethod(int)和其他调用InnerMethod(串),你可以做这样的事情:

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) 
{ 
    // ... 
} 
2

像其他人说,你不能真正做你正在做的事情,你在问题中陈述的选项是最好的选择。

如果您使用泛型,您实际上必须转换该值。否则,你可以通过接受一个Object,如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/en-us/library/ms172193.aspx

+0

只需添加可为空的类型(字符串,但不是int),可以使用“as”关键字进行转换。 – 2009-01-08 00:24:41

1

从你的描述,这似乎是过度优化。

如何:

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

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

好吧,我有类似的情况,它在我的业务逻辑的访问控制方法。

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

所以看起来像这样

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

我如何过有一定实体的一些自定义代码在访问控制方面,所以我写了下面的,它看起来更适合于使用系统问题的方法。反思“,这个实体是否可以由这个用户编写?”

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")); 
     } 

现在,每当我添加或删除的方法的时候,我只需要在一个地方