2009-09-04 6 views
2

C#と.NETの新機能です。整数から列挙型への変換を試みています。変換はChangeTypeで実行可能でなければなりません(私のデモの外はデータバインディングフレームワーク内で固定されています)。読み込んだ内容から、私がやっていることと一緒に動作するはずですが、例外があります。私の変換クラスの関数内のブレークポイントは、何も呼び出されません。C#TypeConverterのlong型からenum型への変換が失敗します。

ありがとうございます!マーティー

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のストレートキャストがうまくいくので、これは面白いです。

あなたが使用しているバインディングフレームワークはわかりませんが、enumのためにこのルートを下っていくのは奇妙に思えます。

私はもっと助けになることはできませんでした。

+0

ありがとうございました - 残念ながら私は残念ながら最後の(コード)行にInvalidCastExceptionを取得しています:-( –

+0

答えを更新しました。 –

+0

Mike、もう一度あなたの助けをありがとうございます。残念ながら、私は変換がどのように行われているのかはわかりません。 LengthUnits型のプロパティにデータバインドされている私のenum値(Int64)の数値表現 何もしなければ、単純に機能しません。バインディングにFormatハンドラを追加すると、その方法ではなく、すべての単一のコントロールに対して行う必要があります(設計時には実行できません)。 私が本当に欲しいのは、データ型バインドを取得して、Int32型のフィールドからLengthUnits型のプロパティに正しく機能することです。-s –

関連する問題