我有一大套Nullable<>变量作为某种复杂算法的输入,其中一些算法在某些情况下不应该为空。目前,当我碰到那堵墙时,我依赖于Nullable<> .Value上抛出的InvalidOperationException。因此,我的算法的客户端应用程序通过该异常知道缺少某些东西,但不知道是什么。
我正在寻找一种方法来捕获该异常并返回导致它的变量名称(这些变量具有人类可读的名称),因此我的客户端应用程序可以获知它。我认为反思是唯一的方法,但我从哪里开始呢?
答案 0 :(得分:1)
对于处理这种特殊情况,Reflection确实很有效,但是我有点震惊,基于条件的检查是不切实际的吗?您必须无法控制这一点,但请理解异常处理是非常密集的性能,并且条件检查会产生更好的结果。无论您是否可以获取相关对象的公共属性,并检查给定有关类型的信息的值。请考虑以下事项:
public class MyClass
{
public int? FirstInteger { get; set; }
public int? SecondInteger { get; set; }
}
public class AwesomeAlgorithm
{
public static void DoSomething(MyClass c)
{
try
{
throw new InvalidOperationException("Something is missing.");
}
catch(InvalidOperationException)
{
foreach(PropertyInfo t in c.GetType().GetProperties())
{
if(t.GetValue(c) == null)
{
//Your code would go here. Console.Writeline as example.
Console.WriteLine("Property {0} appears to be null.", t.Name);
}
}
}
}
}
如果值确实为null,则条件运算将运行...有趣的是,我们仍在使用条件运算符。我个人并不关心这种方法,但有时候我们不需要对这类事情进行控制。
另一件可能更合理的事情是为方法提供默认值,只要它不会错误地操纵你的计算:
public void MyMethod(int? firstValue = 0, int? secondValue = 0) { }
<强>更新强>
如果需要,您可以在本地范围内使用匿名类型https://msdn.microsoft.com/en-us/library/bb397696.aspx来解决此问题。它不是最优雅的解决方案,因为这些类型可能难以使用,但您可能会发现它是可行的:
public static void SomeAlgorithm(int? parameterOne, int? parameterTwo)
{
var values = new { FirstParameter = parameterOne, SecondParameter = parameterTwo };
foreach(PropertyInfo info in values.GetType().GetProperties())
{
if(info.GetValue(values) == null)
{
//Your code would go here.
}
}
}