2009-01-07 103 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")); 
     } 

現在,每當我添加或刪除的方法的時候,我只需要在一個地方