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);

“原因”是 OptionSetValue 类型实体的属性。当像这样使用它时,在上面提到的行上,我会得到这个异常:

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

是因为这两个属性来自不同的程序集吗?如果是这样,甚至有可能做我所追求的吗?

谢谢,

4

2 回答 2

2

我想你回答了你自己的问题。

“原因”是 OptionSetValue 类型实体的属性

如果是这种情况,那么pi.PropertyTypeOptionSetValue,并且

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

返回OptionSetValue

无效演员表来自Convert.ChangeType(value, t). 由于OptionSetValue尚未注册转换器,因此运行时不知道如何进行此转换。如果您有兴趣走这条路线,请参阅这篇 MSDN 文章,了解如何注册。TypeConverter

请参阅 Eve 的使用Activator.CreateInstance来了解如何克服这个问题。

于 2012-12-18T19:43:59.510 回答
1

您不能将整数转换为该类。请改用以下代码:

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

上面的代码所做的是创建一个新实例OptionSetValue并将您的值传递给它的构造函数。

于 2012-12-18T19:42:59.760 回答