2012-05-21 2 views
3

나는 int 인 척하는 클래스를 가지고있어서 다양한 연산자를 오버로드했다. 그러나Reflection.SetValue를 사용할 때 변환을 제공하는 방법은 무엇입니까?

public class MyId 
{ 
    int value; 
    public virtual int Value 
    { 
     get { return this.value; } 
     set { this.value = value; } 
    } 

    public MyId(int value) 
    { 
     this.value = value; 
    } 


    public static implicit operator MyId(int rhs) 
    { 
     return new MyId(rhs); 
    } 

    public static implicit operator int(MyId rhs) 
    { 
     return rhs.Value; 
    } 


} 

, 내가 잘못된 캐스트를 얻을

PropertyInfo.SetValue(myObj, 13, null) 
OR 
MyId myId = 13; 
int x = Convert.ToInt32(myId); 
IConvertible iConvertible = x as IConvertible; 
iConvertible.ToType(typeof(MyId), CultureInfo.CurrentCulture); 

과 같은 코드를 사용합니다. 저는 두 가지 호출이 모두 int에 대한 변환을 호출하려고 시도하는 것 같습니다. 왜냐하면 int는 MyId 유형을 이해하지 못하기 때문에 실패합니다 (모든 대입 연산자가 있지만). 이 문제를 해결하기위한 아이디어가 있다면, 나는 어리석은 뭔가를 놓쳐 버렸을 것입니다.

+2

'IConvertible'구현을 시도해 보셨습니까? – mattytommo

+0

지금까지 설명한 내용은 Int32가 수행하는 것입니다 ... 네이티브 32 비트 정수 주위에 개체 상자를 제공합니다. 나는 당신의 유스 케이스에 더 많은 것이 있다고 가정하지만, 그렇지 않다면 단지 Int32를 사용하십시오. –

+1

myid에 icovertable을 완전히 구현했지만 int32에서 호출하는 것처럼 보이므로 영향을받지 않습니다. – pkr2000

답변

2

암시 적 변환은 C# 구문이며 리플렉션을 통해 사용할 수 없습니다. 또한 리플렉션을 통해 필드 또는 속성을 설정하면 앞에 적절한 유형을 제공해야합니다. 리플렉션을 사용하기 전에 런타임에 유형을 변환하는 데 도움이되는 사용자 정의 TypeConverter (또는 다른 사용자 정의 변환 방법)를 사용하여이 문제를 우회 할 수 있습니다. 다음은 TypeConverter 구현의 대략적인 예입니다.

public class MyIdTypeConverter : TypeConverter 
{     
    public override object ConvertFrom(ITypeDescriptorContext context, 
             System.Globalization.CultureInfo culture, 
             object value) 
    { 
     if (value is int) 
      return new MyId((int)value); 
     else if (value is MyId) 
      return value; 
     return base.ConvertFrom(context, culture, value); 
    }    
} 

다음은 Custom 속성을 설정하려는 유형입니다.

public class Container 
{ 
    [TypeConverter(typeof(MyIdTypeConverter))] 
    public MyId Custom { get; set; }     
} 

속성을 확인하고 SetValue를 호출 할 수있는 후 미리 변환을 수행해야 호출하는 코드입니다.

var instance = new Container(); 
var type = typeof(Container); 
var property = type.GetProperty("Custom"); 

var descriptor = TypeDescriptor.GetProperties(instance)["Custom"]; 
var converter = descriptor.Converter;     
property.SetValue(instance, converter.ConvertFrom(15), null); 
+0

감사합니다. 약간의 오버 헤드처럼 보이기 시작했으나 좋은 해결책이었습니다. 다시 한 번 감사드립니다. – pkr2000

관련 문제