2016-04-13 5 views
0

私は5つの変数を受け取り、すべてオプションの5つのパラメータを受け入れるサービスを呼び出します。受け取った変数のいずれかがnullであれば、サービスコールでそれを使用したくないので、サービスはそれを気に入らず、GetFook'dExceptionをスローします。私はサービスがそれ自身のデフォルト値で空白を埋めるようにする必要があります(彼らが何であるかはわかっていますが、私の知識がなくても変更される可能性があります)。変数のどれもnullをしない場合例えば、私はこれをしたい: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の可能なすべてのバリエーションを経ずにこのことをやってみましょうか?

+0

あなたはSomeService.GiveMeTheStuff' 'オーバーコントロールを持っていますか? 'GiveMeTheStuff'の実際のメソッドシグネチャは何ですか? – Eris

+0

私はSomeServiceを制御できません。これは[メタデータからの]定義です: 'List GiveMeTheStuff(string type1param ="% "、string type2param ="% "、bool isX = false、bool isY = false、bool isZ = false) ' – st3inn

+0

これを試してください:type1param:type1 == null? "abc":type1 – jdweng

答えて

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); 
} 
関連する問題