2012-10-05 45 views
1

好的,所以,我可能是瘋了,但是有可能返回一個未知類型的值並讓它獲得函數嗎?返回未知類的實例?

基本上,看起來像一個函數...

public static ?????? Test(char c) 
{ 
    if(c == char) 
     return instance of SOMECLASS 
    else 
     return instance of SOMEOTHERCLASS 
} 

// so i could do 
Test(new char()).SOMECLASS_METHOD(); 
Test(new int()).SOMEOTHERCLASS_METHOD(); 

請&感謝

編輯:我想補充,是有辦法也使它出現在智能感知?

+2

我感覺這個問題來自於別的東西長鏈...什麼你想在這裏完成嗎? –

+0

僅供參考 - 任何使您不需要知道類型(反射/動態/等)的事情都會使智能感知無法正常工作。 –

回答

4

您可以返回dynamic(在C#4或更高版本中),它允許您使用動態綁定。

如果方法(或屬性)不存在於對象上,那麼將會寫入任何方法,並且僅在運行時上失敗。

例如,你可以寫:

class Foo { 
    void Bar() { Console.WriteLine("Foo.Bar"); } 
} 

class Bar { 
    void Baz() { Console.WriteLine("Bar.Baz"); } 
} 

public static dynamic Test(char c) 
{ 
    if (c == 'f') return new Foo(); 
    else return new Bar(); 
} 

就這樣,你可以寫:

Test('f').Bar(); 
Test('q').Baz(); 
Test('z').Bar(); // Will raise exception at runtime 
+0

謝謝。有沒有辦法讓它出現在intellisense中? – Ber53rker

+0

@ Ber53rker否。運行時類型爲「未知」,因此使用'dynamic'時沒有智能感知。 –

+0

我認爲值得一提的是,如果OP認爲他需要使用這種技術,那麼他的設計幾乎肯定會出現問題。 –

0
public static object Test(char c) 
{ 
    if(c == char) 
     return instance of SOMECLASS 
    else 
     return instance of SOMEOTHERCLASS 
} 

// so i could do 
var r = Test(new char()); 
if (r is SOMECLASS) 
    (r as SOMECLASS).SOMECLASS_METHOD(); 
var rr = Test(new int()); 
if (rr is SOMEOTHERCLASS) 
    (rr as SOMEOTHERCLASS).SOMEOTHERCLASS_METHOD();