我在十进制字段上使用了这个扩展名:
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
答案 0 :(得分:2)
扩展方法不适用于动态。
由于C#编译器在构建时无法解析mySource.prop2
的类型,因此无法知道它可以使用扩展方法。
但是,您仍然可以显式调用该方法:
string resultOutOfProp2 = Extensions.ConvertToStringWithPointDecimal(mySource.prop2);
(与任何静态方法一样)
另请参阅:Extension method and dynamic object以及Jon Skeet和Eric Lippert的答案。