33

いくつかのカスタム構成コレクション、要素などを作成しました。次に、単純な Linq ステートメントを実行したいと思います。

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

エラーが発生します:

ソース タイプ 'MyNamespace.ServerDetails' のクエリ パターンの実装が見つかりませんでした。「場所」が見つかりません。

には次のServerElement2 つのプロパティがあります。

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;
    }
}

何か不足していますか?カスタム構成要素で Linq を使用できるようにするには、何かを追加する必要がありますか?

ちなみに、using System.Linq;同じクラス内の他の場所で使用していると定義しました。

4

4 に答える 4

41

さて、それはすべて弱い型であるとすれば、呼び出すCast<>OfType<>明示的にするか、範囲変数に明示的な型を与える必要があります。ServerCollectionまた、のプロパティを指定する必要がありますServerDetails。例えば:

ServerDetails servers = (ServerDetails) ConfigurationManager.GetSection("serverDetails");
var server = from ServerElement s in servers.ServerCollection
             where s.Name == serverName
             select s;
于 2011-12-07T10:33:37.767 に答える
22

Brian Gideon のIEnumerable<T> 実装でのyield returnの簡単な例を使用して、ConfigurationElementCollection を列挙することができました。

次のようになります(元の質問を使用):

public sealed class ServerCollection : ConfigurationElementCollection,
    IEnumerable<ServerElement>
{
    ...

    public new IEnumerator<ServerElement> GetEnumerator()
    {
        foreach (var key in this.BaseGetAllKeys())
        {
            yield return (ServerElement)BaseGet(key);
        }
    }
}

エラーが発生していませんでしたが:

ソース タイプ 'MyNamespace.ServerDetails' のクエリ パターンの実装が見つかりませんでした。「場所」が見つかりません

...LINQ を使用して ConfigurationElementCollection を反復処理することもできませんでした。このソリューションは私の問題を解決し、LINQ を使用してコレクションを反復処理できるようにしました。

于 2015-04-08T20:10:26.447 に答える