2017-07-11 52 views
1

C#的params關鍵字允許數組和參數列表等價,不是嗎?代表似乎沒有註冊'參數'

不幸的是,在我的實施中,情況並非如此。

private Entities queryType(String entitiesType, params KeyValuePair<String, object>[] values) 
{ 
    addStandardHeaders(); 
    String query = parsePredicate(values); 
    Task<HttpResponseMessage> filterTask = client.GetAsync(client.BaseAddress + RESTapi.ALMentitiesQuery(domain, project, entitiesType, query)); 
    Task.WaitAny(filterTask); 
    //Callback: 
    HttpResponseMessage result = filterTask.Result; 
    if (result.IsSuccessStatusCode) 
    { 
     updateCookies(client.BaseAddress+RESTapi.ALMentitiesQuery(domain, project, entitiesType, query)); 
     mainHeaders.Clear(); 
     Task<Stream> output = result.Content.ReadAsStreamAsync(); 
     Task.WaitAny(output); 
     //Callback: 
     return (Entities)fromJSON(output.Result, typeof(Entities)); 
    } 
    else 
    { 
     util.Exception exception = getException(result); 
     throw new HttpException(exception.Title); 
    } 
} 

委託:

public delegate Entities SubTypeQuery(String subType, params KeyValuePair<String, object>[] values); 

在應用:

public List<Run> getRuns() 
{ 
    List<Entity> selection = ((Entities)subTypeSelector.DynamicInvoke(
     ALMObject.Run.entitiesName(), 
     (new KeyValuePair<String, object>("testcycle-id", id)) 
    )).entities.ToList<Entity>(); 

    List<Run> runSet = new List<Run>(); 
    foreach (Entity element in selection) 
     runSet.Add(new Run(element, subTypeSelector)); 
    return runSet; 
} 

在運行時,我得到一個類型的異常: 「無法轉換KeyValuePair<String, object>KeyValuePair<String, object>[]」。這使得params完全無用。 建議?

+0

請把它降低到[mcve]。你提供的大多數代碼都是不相關的,你沒有告訴我們問題出在哪裏。使用'KeyValuePair '而不是更簡單的類型也使得它比它需要更復雜。 (我也強烈建議你開始遵循.NET的命名約定。) –

回答

2

你爲什麼動態調用?你好像知道所有參數的類型。

什麼錯只是致電委託?

List<Entity> selection = ((Entities)subTypeSelector(
    ALMObject.Run.entitiesName(), 
    (new KeyValuePair<String, object>("testcycle-id", id)) 
)).entities.ToList<Entity>(); 
+0

我的編譯器激怒了我;它解決了這個問題,並說'subTypeSelector在這個上下文中不存在'。任何其他想法? @InBetween – Olivier10178

+1

@ Olivier10178這似乎是一個無關的問題,您手頭的問題以及您發佈的代碼。嘗試創建一個最小的repro併發佈一個新問題。 – InBetween

+0

@InBtetween無需等待;它現在說它是一個不可驗證的成員。 – Olivier10178

0

我建議改變:

new KeyValuePair<String, object>("testcycle-id", id) 

到:

new [] { new KeyValuePair<String, object>("testcycle-id", id) } 

又見How do I pass an object array into a method as individual parameters?

+0

這是如何利用「params」這是OP所問的?如果你動態地調用你的* params提供的靈活性。這裏的問題是爲什麼他動態調用而不是直接調用。 – InBetween

+0

根據Jon Skeet的回答,OP不能在基於反射的場景中使用參數。我的回答僅僅是向他/她展示他/她可能會考慮使用的替代方案。 – mjwills

2

C#的params關鍵字允許數組和參數列表等價,不是嗎?

當涉及C#(或VB)編譯器時,是的。不是當你使用反射。

問題是,您基本上是動態調用委託 - 使用反射。反射代碼不要請注意params。您需要直接調用委託(不包括DynamicInvoke),或者直接創建數組。

+0

如果編譯器說'委託在當前上下文中不存在',我該怎麼辦? – Olivier10178

+0

@ Olivier10178:不知道你的代碼是什麼樣的,這並沒有什麼幫助。你可能想用[mcve]問一個新問題。 –

相關問題