我使用反射来设置对象的属性。如果任何setter抛出异常,则进行SetValue调用的代码不会捕获异常。 Visual Studio告诉我,用户代码没有捕获该异常。
例如,假设在下面的示例中," target"引用的对象上的Title属性设置器变量抛出ArgumentException
。
查看调用堆栈,似乎在下面的代码段与setter之间存在非托管代码。
有人可以(并且谢谢你!)解释:
这是我的代码:
try
{
prop.SetValue(target, attr.Value); // target does have a "Title" property
// attr.Value == "Title"
// the setter throws an ArgumentException
}
catch (Exception ex) // No exception is ever caught.
{
errors.Add(ex.Message);
}
以下是我想要设置的众多属性之一的代码: 公共字符串标题 { 得到 { 返回this.title; }
set
{
if (string.IsNullOrEmpty(value) || value.Length < 1 || value.Length > 128)
{
throw new ArgumentException("Title must be at least 1 character and cannot be longer than 128 characters.");
}
this.title = value;
}
}
答案 0 :(得分:1)
编辑,Framework 4.5确实只有两个参数的重载,所以如果用户正在使用FW 4.5这个答案没有相关性(至少最后一部分是关于的PropertyInfo),
你错了,它被困住了,这是一个展示它的例子:
public class ExceptionGenerator
{
public static void Do()
{
ClassToSet clas = new ClassToSet();
Type t = clas.GetType();
PropertyInfo pInfo = t.GetProperty("Title");
try
{
pInfo.SetValue(clas, "test", null);
}
catch (Exception Ex)
{
Debug.Print("Trapped");
}
}
}
class ClassToSet
{
public string Title {
set {
throw new ArgumentException();
}
}
}
你做错了是获取PropertyInfo,PropertiInfo的SetValue方法需要第三个参数,属性的索引(在你的情况下为null),所以你的&#34; prop&#34;不是PropertyInfo,我认为它是一个FieldInfo,因为它抛出了一个未处理的异常。
答案 1 :(得分:0)
应该抓住任何例外。
请参阅小提琴:https://dotnetfiddle.net/koUv4j
这包括反射调用本身的错误(将属性设置为错误的Type
),或者在属性的setter本身(set
抛出)中有异常。
这会导致其他错误。可能性:
catch
,throw
} 如果不是其中之一,请提供更多信息。