0

我在十进制字段上使用了这个扩展:

public static class Extensions
{
    static System.Globalization.CultureInfo _cultInfo = System.Globalization.CultureInfo.InvariantCulture;
    public static string ConvertToStringWithPointDecimal(this decimal source)
    {
        return source.ToString(_cultInfo);
    }
}

但是当我有一个动态参数时,它包含一个带有小数的类类型,我不能在这些字段上使用扩展名。

测试设置:

public class TestDecimalPropClass
{
    public decimal prop1 { get; set; }
    public decimal prop2 { get; set; }
}

private void TryExtensionOnDynamicButton(object sender, EventArgs e)
{
    TestDecimalPropClass _testDecimalPropClass = new TestDecimalPropClass { prop1 = 98765.432M, prop2 = 159.753M };
    TestExtension(_testDecimalPropClass);
}

private void TestExtension(dynamic mySource)
{
    decimal hardDecimal = 123456.789M;
    string resultOutOfHardDecimal = hardDecimal.ConvertToStringWithPointDecimal();

    decimal prop1Decimal = mySource.prop1;
    string resultOutOfProp1Decimal = prop1Decimal.ConvertToStringWithPointDecimal();

    string resultOutOfProp2 = mySource.prop2.ConvertToStringWithPointDecimal();
}}

resultOutOfHardDecimal 和 resultOutOfProp1Decimal 都返回正确的字符串值,但是当代码命中 mySource.prop2.ConvertToStringWithPointDecimal() 时,我收到此错误:“'decimal' 不包含 'ConvertToStringWithPointDecimal' 的定义”,而 prop2 是十进制类型。

有什么想法吗?

亲切的问候,

马蒂斯

4

1 回答 1

2

扩展方法不适用于动态。

因为 C# 编译器在构建时无法解析 的类型mySource.prop2,所以它无法知道它可以使用扩展方法。

但是,您仍然可以显式调用该方法:

string resultOutOfProp2 = Extensions.ConvertToStringWithPointDecimal(mySource.prop2);

(像任何静态方法一样)

另请参阅:扩展方法和动态对象以及 Jon Skeet 和 Eric Lippert 的答案。

于 2013-09-04T11:02:57.230 回答