我有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
}
答案 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 parameter
以string
的价值进入,因此您的号召
if (parameter.GetType().IsEnum && value is int)
是假的,你直接跳过身体和return false
。
相反,使用Enum.Parse()或Convert.ToInt32()将字符串更改为枚举值或int值,然后进行比较。