2017-07-11 51 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]问一个新问题。 –

相关问题