在Nullable上的InvalidOperationException上抛出指示变量名的异常 - > Value

时间:2016-07-22 14:53:11

标签: c# reflection

我有一大套Nullable<>变量作为某种复杂算法的输入,其中一些算法在某些情况下不应该为空。目前,当我碰到那堵墙时,我依赖于Nullable<> .Value上抛出的InvalidOperationException。因此,我的算法的客户端应用程序通过该异常知道缺少某些东西,但不知道是什么。

我正在寻找一种方法来捕获该异常并返回导致它的变量名称(这些变量具有人类可读的名称),因此我的客户端应用程序可以获知它。我认为反思是唯一的方法,但我从哪里开始呢?

1 个答案:

答案 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.
            }
        }
    }