【发布时间】:2013-07-23 02:24:51
【问题描述】:
我想使用这样的方法调用来格式化任何数字类型:
Option Infer On
Option Strict Off
Imports System.Runtime.CompilerServices
Namespace GPR
Module GPRExtensions
<Extension()>
Public Function ToGPRFormattedString(value) As String
' Use VB's dynamic dispatch to assume that value is numeric
Dim d As Double = CDbl(value)
Dim s = d.ToString("N3")
Dim dynamicValue = value.ToString("N3")
Return dynamicValue
End Function
End Module
End Namespace
现在,根据网络上的各种讨论(VB.Net equivalent for C# 'dynamic' with Option Strict On、Dynamic Keyword equivalent in VB.Net?),我认为此代码在传递数字类型(double、Decimal、int 等)时会起作用。它没有,正如您在屏幕截图中看到的那样:
我可以将参数显式转换为双精度,然后 .ToString("N3") 工作,但只是在所谓的动态 value 参数上调用它失败。
但是,我可以使用以下代码在 C# 中执行此操作(使用 LINQPad)。 (注意,编译器不允许你在扩展方法中使用dynamic 参数,所以这可能是问题的一部分。)
void Main()
{
Console.WriteLine (1.ToGPRFormattedString());
}
internal static class GPRExtensions
{
public static string ToGPRFormattedString(this object o)
{
// Use VB's dynamic dispatch to assume that value is numeric
var value = o as dynamic;
double d = Convert.ToDouble(value);
var s = d.ToString("N3").Dump("double tostring");
var dynamicValue = value.ToString("N3");
return dynamicValue;
}
}
那是什么? VB中有没有一种方法可以在不使用反射的情况下对函数的参数动态调用方法?
【问题讨论】: