7

我创建了一个转换器来从双精度转换为整数。

但是“返回(int)值;”这一行 总是得到一个“指定的演员表无效”。

我该怎么做才能让我的转换器成功转换双精度并发回整数?

转换器:

namespace TestChangeAngle
{
    [ValueConversion(typeof(double), typeof(int))]
    class DoubleToIntegerConverter : IValueConverter
    {
        #region IValueConverter Members

        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return (int)value;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }

        #endregion
    }
}

XAML:

<Page x:Class="TestChangeAngle.Page1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:TestChangeAngle"
    Title="Page1">
    <Page.Resources>
        <local:DoubleToIntegerConverter x:Key="DoubleToIntegerConverter"/>
    </Page.Resources>

    <StackPanel HorizontalAlignment="Left" Margin="20">
        <Image Source="images\logo2.png" 
               RenderTransformOrigin="0.5, 0.5"
               Width="100" 
               Margin="10">
            <Image.RenderTransform>
                <RotateTransform Angle="{Binding ElementName=TheSlider, Path=Value}"/>
            </Image.RenderTransform>
        </Image>
        <Slider x:Name="TheSlider"
                Width="200" 
                Minimum="0"
                Maximum="360"
                HorizontalAlignment="Center"
                Margin="10" 
                Cursor="Hand"/>
        <TextBox x:Name="TheAngle"
                 Margin="10"
                 Width="100">
            <TextBox.Text>
                <Binding ElementName="TheSlider"
                         Path="Value"
                         UpdateSourceTrigger="PropertyChanged"
                         Converter="{StaticResource DoubleToIntegerConverter}"
                         Mode="TwoWay">
                    <Binding.ValidationRules>
                        <local:MinMaxValidationRule Minimum="0" Maximum="360"/>
                    </Binding.ValidationRules>
                </Binding>
            </TextBox.Text>
        </TextBox>

    </StackPanel>
</Page>
4

4 回答 4

8

您正在尝试将(而不是转换)从 double 转换为 int,这是行不通的。您需要进行隐式转换或使用 Convert.ToInt32() - 因为参数实际上是 object 类型,我认为您需要后者来让编译器满意。是否要包含文化的格式提供者取决于您。

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    return Convert.ToInt32(value);
}

当对象具有相同的shape时,您可以使用 cast 运算符,也就是说,当一个对象是您要转换的类型的实例时。例如,如果类 Foo 扩展类 Bar,那么您可以将 Foo 类型的对象强制转换为 Bar 类型 - 因为 Foo 对象具有 Bar 对象所具有的所有方法和属性。但是,您不能将 Bar 类型的对象强制转换为 Foo 类型,因为 Foo通过添加 Bar 对象没有的方法或属性来更改(或可以更改,就编译器而言)Bar的形状.

在您的情况下,您正在处理仅共享对象接口的原始类型 - 除了它们都从对象派生之外,它们之间没有继承关系。但是,两者之间存在隐式转换。您可以将一种类型的对象分配给另一种类型的变量,尽管您可能会失去一些值的精度。

double x = 1.1;
int y = 0;

y = x;  // implicit conversion, this works, y will be 1
x = y;  // implicit conversion, this works, x will be 1.0

但是,您不能将一种类型的对象转换为另一种类型。强制转换意味着您将像使用其他类型的对象一样使用该对象。在这种情况下,形状不同,无法完成。

于 2009-05-17T13:58:35.070 回答
3

问题是您试图同时进行拆箱和强制转换。这将失败。您必须先取消装箱,然后再转换为适当的类型。

return (int)(double)value;

Eric Lippert 最近写了一篇很好的文章,说明为什么这是必要的。值得一读

于 2009-05-17T14:13:08.577 回答
1

double值被装箱在一个对象中,唯一的方法是将其拆箱为double. 之后,您可以将其转换为int.

return (int)(double)value;

您还可以使用该Convert.ToInt32(object)方法(如 tvanfosson 建议的那样),它将对象转换为 IConvertible 并调用它的虚拟ToInt32方法,而虚拟方法又会调用该Convert.ToInt32(double)方法。这当然是更多的开销。

于 2009-05-17T14:16:48.303 回答
1

您想要转换,但您正在从 double 转换为 int。尝试这个:

    public object Convert(object value, ...)
    {
        return (int)(double)value;
    }
于 2009-05-17T14:18:06.490 回答