优雅的方式只包括可选参数if not not null

时间:2016-04-13 21:27:04

标签: c# .net

我有一个接收5个变量的函数,并调用一个接受5个参数的服务,这些参数都是可选的。如果我收到的任何变量是null,我不想在服务调用中使用它,因为服务不是那样的,并且会抛出GetFook&#d; dException。我需要让服务用自己的默认值填充空白(我知道它们是什么,但是在我不知情的情况下它们可能会发生变化)。例如,如果所有变量都不是null,我想这样做:

public List<Stuff> GetStuff(string type1, string type2, bool? isX, bool? isY, bool? isZ)
{
    return SomeService.GiveMeTheStuff(type1, type2, isX.Value, isY.Value, isZ.Value)
}

但是如果例如type2isYnull我想用命名参数执行此操作:

public List<Stuff> GetStuff(string type1, string type2, bool? isX, bool? isY, bool? isZ)
{
    return SomeService.GiveMeTheStuff(type1param: type1, isXparam: isX.Value, isZparam: isZ.Value)
}

如何在不经历所有32种可能的输入变化的情况下进行此操作?

1 个答案:

答案 0 :(得分:1)

我相信你需要结合Type.Missing使用反射:

public List<Stuff> GetStuff(string type1, string type2, bool? isX, bool? isY, bool? isZ)
{
    var type = SomeService.GetType();

    var flags = BindingFlags.Public |
                BindingFlags.Instance |
                BindingFlags.InvokeMethod |
                BindingFlags.OptionalParamBinding;

    var args = new object[]
    {
        type1 ?? Type.Missing,
        type2 ?? Type.Missing,
        isX ?? Type.Missing,
        isY ?? Type.Missing,
        isZ ?? Type.Missing
    };

    return (List<Stuff>)type.InvokeMember(
        nameof(SomeService.GiveMeTheStuff), flags, null, SomeService, args);
}