2011-02-05 82 views
1

使用C#4.0,有沒有辦法允許一個方法(而不是創建一個重載)接受一個字符串或一個int,然後讓我來檢測傳入的類型?如何讓一個方法接受一個字符串或int?

+4

這正是重載方法的用途。你爲什麼反對使用它們? – 2011-02-05 15:24:51

+0

同意科迪。它可以完成,但是我不能以一種非常漂亮的方式完成。我和科迪在下面都有兩個建議,但它確實不是一個很好的方法。 – Bebben 2011-02-05 15:34:57

+0

謝謝科迪。我並不反對他們,我只是想確保我不會錯過4.0中的一個簡單的新功能,可以實現這一點。既然現在可以做可選的命名類型,我想也許有一種新的乾淨的方式來做到這一點。謝謝! – user390480 2011-02-05 15:42:02

回答

15

由於您使用C#4.0中,你可以寫一個generic method。例如:

void MyMethod<T>(T param) 
{ 
    if (typeof(T) == typeof(int)) 
    { 
     // the object is an int 
    } 
    else if (typeof(T) == typeof(string)) 
    { 
     // the object is a string 
    } 
} 

但是你應該認真考慮這是否是一個好主意。上面的例子有點代碼味道。實際上,泛型的全部點是通用。如果必須根據傳入的對象的類型對代碼進行特殊處理,那麼應該使用重載的符號。那樣,每個方法重載處理其獨特的情況。我無法想象這樣做會有什麼不利之處。

4

當然可以!這方面的一個例子是

public void MyMethod(object o) 
    { 
     if (o.GetType() == typeof(string)) 
     { 
      //Do something if string 
     } 
     else if (o.GetType() == typeof(int)) 
     { 
      // Do something else 
     } 
    } 
1

你可以在一些包裝與標誌接口包裹INT,並將它們傳遞給方法。

像這樣的事情

interface IMyWrapper<T> { T Value {get; }} 
public class StringWrapper: IMyMarker<string> { ... } 
public class IntWrapper: IMyMarker<int> { ... } 

void MyMethod<T>(IMyWrapper<T> wrapper) 
{ 
} 
1

我想一個方法重載將是一個簡單的解決方案,如果你想遠離的東西走像反射或檢查的類型。

public void MethodName(string foo) 
{ 
    int bar = 0; 
    if(int.tryparse(foo)) 
     return MethodName(bar);//calls int overload 
} 
相關問題