在运行时确定的参数类型

本文关键字:参数 类型 运行时 | 更新日期: 2023-09-27 18:19:03

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

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

注意:我希望运行时确定参数的类型,而不希望稍后将参数强制转换为另一种类型,因为如果使用泛型则需要这样做。例:我不想要:

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

更新:实际上,我正在为我的编程语言制作一个函数解析器,它可以翻译为c#代码。在我的语言中,我希望参数类型在运行时总是确定。我在寻找一些好的c#功能,以便于翻译。如在我的语言语法中:

 function msg << x
     MessageBox.Show x
 end

需要被翻译成在编译时不要求类型,但在运行时需要类型的东西。如

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

在运行时确定的参数类型

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的方法。

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

如果你需要知道类型…那么你需要知道它的类型。鱼和熊掌不可兼得。

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

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