4

int のふりをするクラスがあるため、さまざまな演算子がオーバーロードされています。

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でconvertを呼び出そうとしているようですが、intは型MyIdを理解していないため失敗します(すべての代入演算子があります)。これに対する回避策のアイデアはありますか?

4

1 に答える 1

4

暗黙的な変換は 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);
于 2012-05-21T23:08:23.277 に答える