2011-12-30 34 views
-1

是否有可能(最好不使用任何第三方库),创建一个函数,其类型是在C#中运行时确定的?功能参数类型在运行时确定?

e.g

public static void myfunc(var x) 
{ 
    System.Windows.Forms.MessageBox.Show(x); //just an example 
} 

注:我想运行来确定参数的类型,不想以后投的参数为另一种类型,如果我使用仿制药是必要的。 e.g我不想:

myfunc<T>(T x) 
// and then : 
MessageBox.Show((string)m); 

更新: 我其实做一个功能解析器my programming language,转化为C#代码。用我的语言,我希望在运行时总是确定参数类型。我一直在寻找一些很好的C#特性以方便翻译。 e.g 在我的语言的语法:

function msg << x 
    MessageBox.Show x 
end 

需要翻译的东西,并没有要求一个类型在编译时间,但需要一个在运行时。 e.g

public static void msg(var x) 
{ 
    System.Windows.Forms.MessageBox.Show(x); 
} 
+1

为什么当你真正指**参数**的类型时,你一直提及**类型的函数**? – Adam 2011-12-30 18:19:30

+2

由于所有对象都实现'ToString()',所以你不需要这种转换。此外,如果您需要将字符串转换为字符串,那么该函数只需要一个字符串!一个有意义的例子将不胜感激。 – 2011-12-30 18:20:48

+0

@codesparkle抱歉,我匆忙地输入了问题。 – ApprenticeHacker 2011-12-30 18:24:49

回答

10

引入用于运行时在C#结合关键字4是dynamic

public static void myfunc(dynamic x) 

这使您可以对编译时未检查的x做出假设,但如果这些假设证明无效,将会在运行时失败。

public static void MakeTheDuckQuack(dynamic duck) 
{ 
    Console.WriteLine(duck.Quack()); 
} 

这里所做的假设是,该参数将有一个名为Quack方法不接受任何参数和返回,然后可以用作参数Console.WriteLine值。如果这些假设中的任何一个都是无效的,您将会遇到运行时失败。

鉴于类定义为

class Duck 
{ 
    public string Quack() 
    { 
     return "Quack!"; 
    } 
} 

class FakeDuck 
{ 
    public string Quack() 
    { 
     return "Moo!"; 
    } 
} 

和方法调用

MakeTheDuckQuack(new Duck()); 
MakeTheDuckQuack(new FakeDuck()); 
MakeTheDuckQuack(42); 

前两个取得成功,因为运行时绑定成功,并在异常第三结果,作为System.Int32没有一个方法名为Quack

一般来说,如果可能的话,您会希望避免这种情况,因为您基本上规定参数满足某种类型的接口而没有严格定义它。如果你在互操作场景中工作,那么也许这就是你必须要做的。如果您正在使用您控制的类型,那么您最好通过接口和/或基类实现编译时安全性。您甚至可以使用不同的策略(例如适配器模式)使您不控制(或无法更改)的类型符合给定的界面。

+0

+1,谢谢,你解决了这个问题。 – ApprenticeHacker 2011-12-30 18:36:59

+0

+1为解释或为什么*不*在大多数情况下使用它,而是做什么。 – Adam 2011-12-30 19:00:32

+1

+9001 for“moo” – Bengie 2011-12-30 19:29:52

0

您可以使用某种类型的对象,或者如果您不知道有多少项可用,则可以使用params对象数组,即params object[] cParams

2

如果您需要知道类型...那么您需要知道类型。你不能吃你的蛋糕,也不能吃。

首先,由于所有对象都实现ToString(),因此示例中的强制转换是不必要的。不要告诉我们你认为你需要什么,告诉我们你想要解决什么问题。通过泛型或使用dynamic关键字(尽管dynamic很少需要)几乎肯定会有解决方案,但我们需要更多信息。如果你添加更多,我会更新这个答案。

+0

您对'dynamic'关键字的建议几乎解决了问题,但我已经更新了我的答案。 – ApprenticeHacker 2011-12-30 18:32:33