web-dev-qa-db-fra.com

Configuration de ElementCollection et Linq

J'ai écrit des collections de configuration personnalisées, des éléments, etc. J'aimerais maintenant faire une simple déclaration Linq:

ServerDetails servers = ConfigurationManager.GetSection("serverDetails") as ServerDetails;
var server = from s in servers
             where s.Name == serverName
             select s;

Je reçois l'erreur:

Impossible de trouver une implémentation du motif de requête pour le type de source 'MyNamespace.ServerDetails'. "Où" pas trouvé.

La ServerElement a deux propriétés:

public class ServerElement : ConfigurationElement
{
    [ConfigurationProperty("ip")]
    public string IP
    {
        get { return (string)base["ip"]; }
        set { base["ip"] = value; }
    }

    [ConfigurationProperty("name", IsKey = true, IsRequired = true)]
    public string Name
    {
        get { return (string)base["name"]; }
        set { base["name"] = value; }
    }
}

ServerDetails

public sealed class ServerDetails : ConfigurationSection
{
    [ConfigurationProperty("ServerCollection")]
    [ConfigurationCollection(typeof(ServerCollection), AddItemName = "add")]
    public ServerCollection ServerCollection
    {
        get { return this["ServerCollection"] as ServerCollection; }
    }
}

ServerCollection

public sealed class ServerCollection : ConfigurationElementCollection
{
    public void Add(ServerElement ServerElement)
    {
        this.BaseAdd(ServerElement);
    }

    public override ConfigurationElementCollectionType CollectionType
    {
        get { return ConfigurationElementCollectionType.AddRemoveClearMap; }
    }

    protected override ConfigurationElement CreateNewElement()
    {
        return new ServerElement();
    }

    protected override object GetElementKey(ConfigurationElement element)
    {
        return ((ServerElement)element).Name;
    }
}

Est-ce que je manque quelque chose? Dois-je ajouter quelque chose pour pouvoir utiliser Linq avec un élément de configuration personnalisé?

Au fait, j'ai using System.Linq; défini car je l'utilise ailleurs, dans la même classe.

30
Neil Knight

OK, étant donné que tout est faiblement typé, vous devrez appeler Cast<> ou OfType<> explicitement ou donner un type explicite à la variable de plage. Vous devrez également spécifier la propriété ServerCollection sur votre ServerDetails. Par exemple:

ServerDetails servers = (ServerDetails) ConfigurationManager.GetSection("serverDetails");
var server = from ServerElement s in servers.ServerCollection
             where s.Name == serverName
             select s;
38
Jon Skeet
 var server = ((ServerDetails) ConfigurationManager.GetSection("serverDetails")).
      ServerCollection.Cast<ServerElement>().FirstOrDefault(x => x.Name == serverName);
0
Jay Shah