我想使用如下方法调用格式化任何数字类型:
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 等效于 C# 'dynamic' with Option Strict On,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中有没有办法在不使用反射的情况下对函数的参数动态调用方法?