2009-09-04 3 views
2

저는 C#과 .NET에 대해 매우 익숙합니다. 정수에서 열거 형으로 작업하도록 변환하려고합니다. 변환은 ChangeType에서 수행 할 수 있어야합니다 (아래의 데모는 데이터 바인딩 프레임 워크 내에서 고정되어 있습니다). 그리고 내가 읽은 것에서는 내가하고있는 일과 함께 작동해야하지만, 예외가 발생합니다. 내 변환 클래스의 함수에서 중단 점이 있으면 아무 것도 호출되지 않습니다.C# TypeConverter는 열거 형 타입으로 길어질 때 ChangeType에서 실패합니다.

미리 감사드립니다. - 매튜.

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이 표시됩니다 .-( –

+0

대답이 업데이트되었습니다. 전에 TypeConverter 문제 만 보았습니다. 보지 못했습니다. 당신이 정말로하려고했던 일입니다. 새로운 대답이 도움이 되었기를 바랍니다. –

+0

마이크, 도움을 다시 주셔서 감사합니다. 불행히도, 나는 변환이 어떻게 이루어지는지를 제어하지 못합니다. LengthUnits 형식의 속성에 데이터 바인딩되는 내 열거 형 값 (Int64)의 숫자 표현 아무 것도하지 않으면 바인딩에 Format 처리기를 추가하면 작동하지 않습니다. 그런 식으로 모든 단일 컨트롤에 대해 그렇게해야합니다 (디자인 타임에는 수행 할 수 없음) 필자가 정말로 원했던 것은 데이터 바인딩을 통해 Int32 유형의 필드에서 LengthUnits 유형의 속성으로 작업하는 것입니다. -s –