在无效操作时引发指示变量名称的异常在可为空>值时引发异常



我有一大组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.
            }
        }
    }

相关内容

  • 没有找到相关文章

最新更新