1

この場合、Int32 からより複雑な型へのキャストを検討しています。

通常の方法でこの複合型のインスタンスを取得する方法は次のとおりです。

OptionSetValue option = new OptionSetValue(90001111); //int value...

今、私はリフレクションを介してこれをやろうとしています。これが私の方法です:

    public static void SetValue(object entity, string propertyName, object value)
    {
        try
        {
            PropertyInfo pi = entity.GetType().GetProperty(propertyName);
            Type t = Nullable.GetUnderlyingType(pi.PropertyType) ?? pi.PropertyType;
            object safeValue = (value == null) ? null : Convert.ChangeType(value, t); //Line where the exception is thrown...
            pi.SetValue(entity, safeValue, null);

        }
        catch
        {
            throw;
        }

        return;
    }

そして、これが私がそれを使用する方法です:

SetValue(entity, "reason", 90001111);

「reason」は、タイプ OptionSetValue のエンティティのプロパティです。このように使用すると、上記の行で次の例外が発生します。

Invalid cast from 'System.Int32' to 'Microsoft.Xrm.Sdk.OptionSetValue'.

2 つのプロパティが異なるアセンブリに由来するためですか? もしそうなら、私が求めていることをすることさえ可能ですか?

ありがとう、

4

2 に答える 2

2

あなたはあなた自身の質問に答えたと思います。

「理由」はタイプ OptionSetValue のエンティティのプロパティです

その場合pi.PropertyTypeOptionSetValueであり、

Type t = Nullable.GetUnderlyingType(pi.PropertyType) ?? pi.PropertyType;

戻りますOptionSetValue

無効なキャストは から来ていConvert.ChangeType(value, t)ます。のコンバーターOptionSetValueが登録されていないため、ランタイムはこの変換を行う方法を知りません。そのルートに興味がある場合は、登録方法TypeConverterに関するこの MSDN の記事も参照してください。

Activator.CreateInstanceこの問題を解決する方法については、Eve の の使用を参照してください。

于 2012-12-18T19:43:59.510 に答える
1

そのクラスに整数をキャストすることはできません。代わりに次のコードを使用してください。

object safeValue = (value == null) ? null : Activator.CreateInstance(t, value);

上記のコードが行うことは、 の新しいインスタンスを作成しOptionSetValue、値をそのコンストラクターに渡すことです。

于 2012-12-18T19:42:59.760 に答える