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.
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;
var server = ((ServerDetails) ConfigurationManager.GetSection("serverDetails")).
ServerCollection.Cast<ServerElement>().FirstOrDefault(x => x.Name == serverName);