为什么将存储在对象中的枚举转换为int返回一个字符串?

时间:2011-08-18 17:57:23

标签: c# wpf enums

我有object类型的属性,其中包含Enum值,当我使用(int)value投射时,它会返回枚举名称的string。为什么?

我注意到的代码在this answer中。使用Convert.ToInt32()正确地将Enum投射到int,但我很好奇为什么在使用(int)时我会收到字符串。它甚至没有给我一个错误。

修改

这是一个快速的样本。我评论了断点的位置,并使用立即窗口来确定输出是什么。

MainWindow.xaml.cs

public partial class MainWindow : Window
{
    public Int32 SomeNumber { get; set; }

    public MainWindow()
    {
        InitializeComponent();

        SomeNumber = 1;
        RootWindow.DataContext = this;

    }
}

public enum MyEnum
{
    Value1 = 1,
    Value2 = 2,
    Value3 = 3
}


/// <summary>
/// Returns true if the int value equals the Enum parameter, otherwise returns false
/// </summary>
public class IsIntEqualEnumParameterConverter : IValueConverter
{
    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (parameter == null || value == null) return false;

        if (parameter.GetType().IsEnum && value is int)
        {
            // Breakpoint here
            return (int)parameter == (int)value;
        }
        return false;
    }

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

    #endregion
}

MainWindow.xaml

<Window x:Class="WpfApplication5.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication5"
        Title="MainWindow" Height="350" Width="525"
        x:Name="RootWindow">

    <Window.Resources>
        <local:IsIntEqualEnumParameterConverter x:Key="IsIntEqualEnumParameterConverter" />
    </Window.Resources>

    <StackPanel>
        <TextBlock Text="{Binding SomeNumber, Converter={StaticResource IsIntEqualEnumParameterConverter}, ConverterParameter={x:Static local:MyEnum.Value1}}" />
    </StackPanel>
</Window>

编辑#2

希望能够澄清一些困惑......

我说它正在返回一个字符串,因为在立即窗口中运行?((int)parameter)返回枚举名称,而运行?System.Convert.ToInt32(parameter)正在显示int。

之后我发现它实际上一直在正确评估DataTrigger。我认为这不是因为我的控件在运行时不可见,但是我发现这是因为我的XAML中的错误(我忘记了Grid.Column属性,所以一个控件与另一个控件重叠)。

抱歉这个令人困惑的问题。

编辑#3

以下是一些控制台应用程序代码,仅为Jon展示了这种情况:)

class Program
{
    static void Main(string[] args)
    {
        object value;
        value = Test.Value1;

        // Put breakpoint here
        // Run ?(int)value vs Convert.ToInt32(value) in the immediate window
        // Why does the first return Value1 while the 2nd returns 1?
        Console.ReadLine();
    }
}

public enum Test
{ 
    Value1 = 1
}

5 个答案:

答案 0 :(得分:11)

听起来你被立即窗口欺骗了。目前尚不清楚你在立即窗口中确切地做了什么,但我可以说绝对确定如果你施放到int那么你做没有返回string。类型系统完全可以防止这种情况发生。

答案 1 :(得分:1)

你在这里描述的技术上是不可能的。你看到的是调试器显示的枚举成员的名称。可以把它想象成“语法糖”。所以真正的问题恕我直言,只是因为它不相等。

要检查一下:

读取你的“字符串”,检查在声明的枚举中分配给的整数,并且如果整数实际上等于函数中的参数那么整数。

答案 2 :(得分:1)

你的问题实际上是“为什么”,而不是“如何”,我意识到这一点。

但是,方法如下:

enum Options : int { one = 1, two = 2, three = 3 }
public MainWindow()
{
    InitializeComponent();

    object _Option = Options.three;

    // shows "three"
    MyTextBox.Text = ((Options)_Option).ToString();

    // shows "3"
    MyTextBox.Text = ((int)((Options)_Option)).ToString();
}

答案 3 :(得分:0)

我已将此代码示例遗忘,并且我发现它每次都返回false,因为value is int失败了。 value是一个对象,而不是整数。

答案 4 :(得分:0)

我想现在发生的事情是object parameterstring的价值进入,因此您的号召

 if (parameter.GetType().IsEnum && value is int)

是假的,你直接跳过身体和return false

相反,使用Enum.Parse()或Convert.ToInt32()将字符串更改为枚举值或int值,然后进行比较。