动态字段无法识别扩展名

时间:2013-09-04 10:42:57

标签: c# dynamic decimal extension-methods

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

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是十进制类型。

有什么想法?

亲切的问候,

Matthijs

1 个答案:

答案 0 :(得分:2)

扩展方法不适用于动态。

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

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

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

(与任何静态方法一样)

另请参阅:Extension method and dynamic object以及Jon Skeet和Eric Lippert的答案。