我有一大组Nullable<>变量作为某种复杂算法的输入,其中一些在某些上下文中不应该为空。目前,我依赖于对Nullable<>抛出的InvalidOperationException。当我撞到那堵墙的时候,价值。因此,我的算法的客户端应用程序通过该异常知道缺少了什么,但不知道是什么。
我正在寻找一种方法来捕捉该异常,并返回导致该异常的变量的名称(这些变量有人类可读的名称),这样我的客户端应用程序就可以了解它。我认为反射是唯一的方法,但我该从哪里开始呢?
反射确实能很好地处理这个特定场景,这是正确的,但我对基于条件的检查不切实际感到有些震惊?您一定不能控制这一点,但请理解,异常处理在性能方面是非常密集的,条件检查会产生更好的结果。不管怎样,您都可以获得有问题对象的公共属性,并在给定类型信息的情况下检查值。考虑以下内容:
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.
}
}
}