2012-10-05 48 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();