【发布时间】:2015-12-23 10:01:50
【问题描述】:
我继承了一些试图设置属性的代码:
object target = ... // some instance on which we want to set a property
object value = ... // some value - in this case, a string
var propertyInfo = ... // some property of target - in this case, not a string
try
{
propertyInfo.SetValue(obj, value, null);
}
catch (ArgumentException)
{
// We go off and look for our own way of converting between
// the type of value and the type of the property.
}
在当前使用中,异常被捕获并抛出了很多,所以我想先检查一下:
if (propertyInfo.PropertyType.IsAssignableFrom(value.GetType())
{
// Try/catch as above
}
else
{
// Do the manual conversion as if the exception had been thrown.
}
这运行得更快。然而,我的一个担忧是IsAssignableFrom 可能会为SetValue 实际上成功 的某些类型返回false。 (这会导致我们在不需要时寻找手动转换,并且可能无法完全设置值。)
SetValue 的规范说
value不能转换为PropertyType的类型
这与可分配性并不完全相同。
(如果IsAssignableFrom 在SetValue 失败的情况下返回true,那很好——手动转换仍然会发生。)
有人可以帮我确认这是否可能吗?
【问题讨论】:
-
请举一个发生这种情况的实际例子。大概你有一个,所以应该很容易给出一个简短但完整的例子,记录
IsAssignableFrom并成功调用SetValue。 (这可能只是原语的问题,可以相当容易地检测到......) -
@Jon 我看到很多失败的情况是尝试将
string分配给无法从string分配的自定义类型的属性(但我们有一个自定义转换器) .但是,这段代码可以将任何类型设置为任何其他类型,我不想破坏它,所以我对一般情况感兴趣。 -
嗯,我很惊讶
SetValue会调用自定义转换器 - 但同样,一个完整的示例会说明这一点。 -
@Jon
SetValue不调用转换器。如果SetValue失败,我们会去寻找一个。如果它失败了,我真的不认为我们做什么很重要——我只需要知道它是否与IsAssignableFrom不一致。 -
重要的是您声称
SetValue在使用无法转换为属性类型的类型调用时会成功。这对我来说似乎很不寻常,所以我要求举个例子。我不确定你为什么不愿意提供这样的例子。 (不清楚您所说的“这会导致我们寻找 TypeConverter”是什么意思 - 会是什么?那个代码在哪里?我希望 SetValue 失败,然后你可以寻找一个类型转换器...)
标签: c# reflection type-conversion