函数运行时确定的参数类型?

App*_*ker -1 .net c# runtime c#-4.0

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

例如

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

注意:我希望运行时确定参数的类型,并且不希望稍后将参数转换为其他类型,如果我使用泛型则需要.我不想要:

 myfunc<T>(T x) 
 // and then :
 MessageBox.Show((string)m);
Run Code Online (Sandbox Code Playgroud)

更新:我实际上正在为我的编程语言创建一个函数解析器,它转换为C#代码.在我的语言中,我希望始终在运行时确定参数类型.我正在寻找一些好的C#功能,以便轻松翻译.例如,在我的语言语法中:

 function msg << x
     MessageBox.Show x
 end
Run Code Online (Sandbox Code Playgroud)

需要转换为在编译时不要求类型的东西,但在运行时需要一个类型.例如

public static void msg(var x)
{
     System.Windows.Forms.MessageBox.Show(x);
}
Run Code Online (Sandbox Code Playgroud)

Ant*_*ram 10

在C#4中为运行时绑定引入的关键字是dynamic.

public static void myfunc(dynamic x)
Run Code Online (Sandbox Code Playgroud)

这允许您对在编译时未选中的x进行假设,但如果这些假设无效,则会在运行时失败.

public static void MakeTheDuckQuack(dynamic duck)
{
    Console.WriteLine(duck.Quack()); 
}
Run Code Online (Sandbox Code Playgroud)

这里假设的是参数将有一个名为Quack不接受任何参数的方法,并返回一个可以用作参数的值Console.WriteLine.如果这些假设中的任何一个无效,您将收到运行时故障.

给定的类定义为

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

class FakeDuck
{
    public string Quack()
    {
        return "Moo!";
    }
}
Run Code Online (Sandbox Code Playgroud)

和方法调用

MakeTheDuckQuack(new Duck());
MakeTheDuckQuack(new FakeDuck());
MakeTheDuckQuack(42);
Run Code Online (Sandbox Code Playgroud)

前两个成功,因为运行时绑定成功,第三个导致异常,因为System.Int32没有名为的方法Quack.

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