2012-12-13 55 views
0

我想從第一類或第二類設置變量結果方法,這取決於類型,我的代碼有什麼問題?通用方法 - 調用方法不同類

public ActionResult Contact() 
    { 
     ViewBag.Message = GetValue(new ClassOne(), "classOne"); 

     return View(); 
    } 



    public string GetValue<T>(T customClass, string type) 
    { 
     if (type == "classOne") return customClass.ClassOneMethod(); 
     else customClass.ClassTwoMethod(); 
    } 

    class ClassOne 
    { 
     public string ClassOneMethod() 
     { 
      return "ClassOneMethod"; 
     } 
    } 

    class ClassTwo 
    { 
     public string ClassTwoMethod() 
     { 
      return "ClassTwoMethod"; 
     } 
    } 
+3

是否有一個原因,爲什麼這兩類不要做一些不同的實現接口和'GetValue'是像'字符串的GetValue(ISomeInterface OBJ){ obj.DoSomething(); }'? – Jon

+2

那麼,編譯器說什麼? –

+0

編譯器可能無法弄清楚'T'類型的'customClass'是否有稱爲'ClassOneMethod'和'ClassTwoMethod'的方法。 –

回答

2

的問題是,編譯器知道在編譯時一無所知T型,無法弄清楚,包含在customClass的對象有一個名爲ClassOneMethodClassTwoMethod方法。你有幾個選擇,例如從一個公共基類派生出來,覆蓋一個虛擬方法或實現一個接口。

這裏有一些關於如何使用接口來做的提示。這遠不是完美的,但我試圖保持它非常接近您的原始代碼。

interface IHaveAMethod 
{ 
    String GetString(); 
} 

public ActionResult Contact() 
{ 
    ViewBag.Message = GetValue(new ClassOne()); 

    return View(); 
} 

public String GetValue<T>(T customClass) where T : IHaveAMethod 
{ 
    return customClass.GetString(); 
} 

class ClassOne : IHaveAMethod 
{ 
    public String GetString() 
    { 
     return "ClassOneMethod"; 
    } 
} 

class ClassTwo : IHaveAMethod 
{ 
    public String GetString() 
    { 
     return "ClassTwoMethod"; 
    } 
} 
+0

不需要'GetValue'是通用的,只需要將參數作爲'IHaveAMethod'的一個實例即可。 – Servy

+0

對。首先可能不需要使用方法'GetValue ',但是 - 如前所述 - 我試着讓代碼接近問題以避免混淆。 –

+0

thx非常多:) – michael

2

您的代碼不起作用,因爲您的類沒有相同的定義。你可以改變你這樣的代碼來獲取你的代碼運行:

public ActionResult Contact() 
{ 
    ViewBag.Message = GetValue<MyInterface>(new ClassOne()); 
    return View(); 
} 

public string GetValue<T>(T customClass, string type) 
{ 
    return customClass.MyMethod 
} 

class ClassOne : IMyInterface 
{ 
    public string MyMethod() 
    { 
     return "ClassOneMethod"; 
    } 
} 

class ClassTwo : IMyInterface 
{ 
    public string MyMethod() 
    { 
     return "ClassTwoMethod"; 
    } 
} 

public Interface IMyInterface 
{ 
    string MyMethod(); 
} 
+0

thx非常多:) – michael