从Dictionary Lookup

时间:2016-04-05 18:19:24

标签: c# object dictionary static return

这是我的代码:

namespace BingAdsDataImporter
{
    class DeveloperDetails
    {

        public string ClientId { get; set; }
        public string DeveloperToken { get; set; }

    }

    static class CollInit
    {
        public static Dictionary<string, DeveloperDetails> details = new Dictionary<string, DeveloperDetails>()
        {
            { "Clientnamehere", new DeveloperDetails {ClientId="xxx", DeveloperToken="xxxx"} }
        };

        public static DeveloperDetails GetValue(string key)
        {
            if ( details.TryGetValue(key, out DeveloperDetails) ) // fails here Error   1   'BingAdsDataImporter.DeveloperDetails' is a 'type' but is used like a 'variable'
            {
                return dd;
            }
            else
            {
                return null;
            }

        }
    }
}

失败的地方是静态方法GetValue(字符串键)。 我想返回DeveloperDetails对象,或者可能为令牌创建另一个方法,并更改此方法名称以返回密钥。我无法使用out关键字返回对象(虽然我不知道为什么),我无法弄清楚如何从该对象返回特定值,这是首选。任何帮助表示赞赏。

修正了我的新方法

    public static DeveloperDetails GetObjectDetails(string key)
    {
        DeveloperDetails dd = null;
        if ( details.TryGetValue(key, out dd) )
        {
            return dd;
        }
        else
        {
            return null;
        }

    }
    public static string GetClientId(string key)
    {
        DeveloperDetails dd = null;
        if (details.TryGetValue(key, out dd))
        {
            return dd.ClientId;
        }
        else
        {
            return null;
        }

    }
    public static string GetDeveloperToken(string key)
    {
        DeveloperDetails dd = null;
        if (details.TryGetValue(key, out dd))
        {
            return dd.DeveloperToken;
        }
        else
        {
            return null;
        }

    }

3 个答案:

答案 0 :(得分:3)

out关键字需要一个变量来将值放入:

    public static DeveloperDetails GetValue(string key)
    {
        DeveloperDetails dd;
        if ( details.TryGetValue(key, out dd) )
        {
            return dd;
        }
        else
        {
            return null;
        }
    }

由于out参数将保留null,如果该值不在字典中,则可以进一步简化为:

    public static DeveloperDetails GetValue(string key)
    {
        DeveloperDetails dd;
        details.TryGetValue(key, out dd);
        return dd;
    }

或者(在我编写的框架的无耻插件中),您可以使用CallMeMaybe库中的扩展程序:

    public static DeveloperDetails GetValue(string key)
    {
        return details.GetMaybe(key).Else(() => null);
    }

如果您要使用最后一种方法,可以考虑完全取消GetValue方法,并让调用代码利用Maybe<>类型。例如:

string clientId = details.GetValue(key).ClientId; // could throw null reference

...变成

Maybe<string> clientId = details.GetMaybe(key).Select(d => d.ClientId);

答案 1 :(得分:1)

试试这个:

    public static DeveloperDetails GetValue(string key)
    {
        DeveloperDetails dd = null;
        if ( details.TryGetValue(key, out dd) )
        {
            return dd;
        }
        else
        {
            return null;
        }

    }

您提供的DeveloperDetails是返回类型定义。但是需要传递一个变量名。

答案 2 :(得分:1)

StriplingWarrior的回答是您正在寻找的答案。

但是,如果您只想从developerDetails返回一个值:

public static string GetValue(string key)
{
    DeveloperDetails dd;
    if ( details.TryGetValue(key, out dd) )
    {
        return dd.ClientID;  //or dd.DeveloperToken
    }
    else
    {
        return null;
    }

}