我有一个接收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)
}
但是如果例如type2
和isY
是null
我想用命名参数执行此操作:
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种可能的输入变化的情况下进行此操作?
答案 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);
}