在运行时确定的参数类型
本文关键字:参数 类型 运行时 | 更新日期: 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