2009-09-04 91 views
2

我对C#和.NET相当新 - 我试图让转换工作从一个整数到一个枚举。转换必须由ChangeType执行(在我的演示之外,因为它在数据绑定框架内,所以它是固定的),并且从我读过的内容中应该能够处理我正在做的事情,但是我得到一个异常,并且如果我将在我的转换类的功能断点,没有任何东西被调用。C#TypeConverter长枚举类型在更改类型上失败

在此先感谢! -马修。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.ComponentModel; 

namespace csharptest 
{ 
    class Program 
    { 

     [TypeConverter(typeof(UnitEnumConverter))] 
     public enum LengthUnits 
     { 
      METRES, 
      FEET 
     }; 

     public class UnitEnumConverter : EnumConverter 
     { 
      public UnitEnumConverter(System.Type type) 
       : base(type.GetType()) 
      { 
      } 

      public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) 
      { 
       if (sourceType == typeof(Int64)) return true; 

       return base.CanConvertFrom(context, sourceType); 
      } 

      public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) 
      { 
       if (value is Int64) 
       { 
        return (LengthUnits)(Int64)value; 
       } 
       return base.ConvertFrom(context, culture, value); 
      } 
     } 

     static void Main(string[] args) 
     { 
      LengthUnits units = new LengthUnits(); 

      long x = 1; 

      units = (LengthUnits)System.Convert.ChangeType(x, typeof(LengthUnits)); 

     } 
    } 
} 

回答

3

从以前的答案

Convert.ChangeType不会打扰在TypeConverter的期待,这样是没有帮助从头开始。使用Reflector查看Convert.ChangeType看起来好像不起作用。它有一个可以转换的东西的静态地图。如果它不在列表中,它不会尝试并转换。这很有趣,因为直接投射一个int或一个long到你的枚举将会起作用。

我不确定你正在使用哪个绑定框架,但看起来很奇怪,它会沿着这条路线进行枚举。

对不起,我无法提供更多帮助。

+0

谢谢 - 我已经修改了,但不幸的是我仍然在最后(代码)行上得到InvalidCastException :-( – 2009-09-04 12:11:13

+0

更新了答案,我只看了TypeConverter问题,我没有看过 – 2009-09-04 12:55:41

+0

Mike,再次感谢您的帮助。不幸的是,我无法控制转换是如何完成的。我有一个数据库,其中包含一个字段,其中包含一个字段我的枚举值的数值表示(Int64)被数据绑定到LengthUnits类型的属性 如果我什么都不做,它根本不起作用,如果我向绑定添加一个Format处理程序,那么我可以处理这种方式,但必须为每一个单一的控制(而不是在设计时间)这样做。 我真正想要的是将数据绑定成功从Int32类型的字段工作到LengthUnits类型的属性:-s – 2009-09-04 13:14:03