Linq ToDictionary返回匿名类型

时间:2010-11-30 16:43:32

标签: linq dynamic anonymous-types

我想调用一个返回匿名类型的方法。我需要知道这个匿名类型的类型是什么,因为我在一个方法中返回它。它被称为“动态”吗?当我调试时,监视窗口显示类型是<> f__AnonymousType0。

这是我的代码:

// this doesn't compile
public static Dictionary<int,dynamic> GetRuleNamesDictionary()
{
    List<ResponseRoutingRule> rules = GetResponseRoutingRules();    
    var q = (rules.Select(r => new {r.ResponseRoutingRuleId, r.RuleName}));

    var dict1 = q.ToDictionary(d => d.ResponseRoutingRuleId);
    var dict = q.ToDictionary(d => d.ResponseRoutingRuleId, d => d.RuleName);
    return dict;
}

public static List<ResponseRoutingRule> GetResponseRoutingRules()
{
   ....
}


public class ResponseRoutingRule
{
    public int ResponseRoutingRuleId { get; set; }
    ....
    public string RuleName { get; set; }
    ...
}

3 个答案:

答案 0 :(得分:3)

嗯,你实际上似乎正在返回Dictionary<int, string>dict的值类型不是匿名类型;这是一个普通的string。事实上,这里似乎不需要匿名类型 dynamic

你确定这不是你真正想要的吗?

public static Dictionary<int, string> GetRuleNamesDictionary()
{
    return GetResponseRoutingRules()
            .ToDictionary(r => r.ResponseRoutingRuleId, r => r.RuleName);    
}

如果没有,请告诉我们原因。

如果确实希望坚持使用dynamic,您当然可以酌情投票:

public static Dictionary<int, dynamic> GetRuleNamesDictionary()
{
    return GetResponseRoutingRules()
            .ToDictionary(r => r.ResponseRoutingRuleId, r => (dynamic) r.RuleName);    
}

答案 1 :(得分:0)

这是一个对象。如果您需要强力打字,请不要匿名。

答案 2 :(得分:0)

我真正想做的是返回一个包含2个名为ResponseRoutingRuleIdRuleName的属性的动态类型。这样我就可以将其分配给MVC选择列表并指定dataValue字段和dataText字段。

SomeMethod(){
    List<{my dynamic type}> ruleObject = GetRuleObject();

    var ruleSelectList = new Web.Mvc.SelectList (ruleObject, "ResponseRoutingRuleId", "RuleName");
}

List<{my dynamic type}> GetRuleObject(){...}

在我的Linq查询中,我收到了这个动态对象,但我不知道在GetRuleObject()中要指定的返回类型。