2014-09-05 4 views
0

구성 파일에서 구성 섹션을 읽었습니다. xml은 다음과 같습니다.C# ConfigurationSection에서 중복 이름을 반환하지 않습니다.

<GroupBySection> 
    <Groups> 
     <Group name="Source" product="Product One"> 
      <Items> 
       <Item name="2003" type="radio" /> 
       <Item name="2007" type="radio" /> 
       <Item name="2010" type="radio" /> 
       <Item name="2013" type="radio" /> 
       <Item name="o365" type="radio" /> 
      </Items> 
     </Group> 
     <Group name="Target" product="Product One"> 
      <Items> 
       <Item name="2003" type="radio" /> 
       <Item name="2007" type="radio" /> 
       <Item name="2010" type="radio" /> 
       <Item name="2013" type="radio" /> 
       <Item name="o365" type="radio" /> 
      </Items> 
     </Group> 
     <Group name="Source" product="Product Two"> 
      <Items> 
       <Item name="2003" type="radio" /> 
       <Item name="2007" type="radio" /> 
       <Item name="2010" type="radio" /> 
       <Item name="2013" type="radio" /> 
       <Item name="o365" type="radio" /> 
      </Items> 
     </Group> 
    </Groups> 
</GroupBySection> 

이 구성 섹션을 호출하고 계산을 수행하면 첫 번째 제품 원 결과 만 표시됩니다. 제품 2가 표시되지 않습니다. 이름이 "소스"이기도합니다. 이름이 같은지 상관없이 모두 표시하도록합니다. 즉, 내가 원한다고해도 이미 왔던 동일한 이름의 어떤 것도 반환하지 않을 것입니다. 누군가 ive가 잘못한 것을 지적 할 수 있습니까?

코드 감사합니다 :)

public class GroupByConfiguration : ConfigurationSection 
{ 
    [ConfigurationProperty("Groups")] 
    public GroupByElementCollection Groups 
    { 
     get { return ((GroupByElementCollection)(base["Groups"])); } 
     set { base["Groups"] = value; } 
    } 
} 

요소 섹션

public class GroupByElement : ConfigurationElement 
{ 
    // Group Attributes 
    [ConfigurationProperty("name", IsRequired = true)] 
    public string Name 
    { 
     get { return (string)base["name"]; } 
    } 

    [ConfigurationProperty("product", IsRequired = true)] 
    public string Product 
    { 
     get { return (string)base["product"]; } 
    } 

    [ConfigurationProperty("Items")] 
    public ItemElementCollection Items 
    { 
     get { return ((ItemElementCollection)(base["Items"])); } 
     set { base["Items"] = value; } 
    } 
} 

요소 컬렉션

[ConfigurationCollection(typeof(GroupByElement))] 
public class GroupByElementCollection : ConfigurationElementCollection 
{ 
    internal const string PropertyName = "Group"; 

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

    protected override string ElementName 
    { 
     get 
     { 
      return PropertyName; 
     } 
    } 

    protected override bool IsElementName(string elementName) 
    { 
     return elementName.Equals(PropertyName, StringComparison.InvariantCultureIgnoreCase); 
    } 

    public override bool IsReadOnly() 
    { 
     return false; 
    } 

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

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

    public GroupByElement this[int idx] 
    { 
     get { return (GroupByElement)BaseGet(idx); } 
    } 

} 

나는 확신 바보 뭔가없는 ConfigurationSection

이하 전 사전에!

답변

0

추측의 종류,하지만 방법처럼 보인다 :

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

이 가장 가능성이 범인입니다. 즉, 해당 페이지에 따르면 파생 클래스에서 재정의 될 때

http://msdn.microsoft.com/en-us/library/system.configuration.configurationelementcollection.getelementkey(v=vs.110).aspx

지정된 구성 요소의 요소 키를 취득.

즉,이 메서드는 .NET에서 부모 태그를 재정의 할 수있는 하위 폴더의 구성 파일에서 태그를 식별 할 수있는 방법을 반환합니다. 그런 점에서 키를 고유하게 제한하는 것이 합당한 것처럼 보이므로 ((GroupByElement)(element)).Name 속성을 키로 지정하면 고유해야 함을 알 수 있습니다.

한 가지 방법은 NameProduct을 반환하는 것이고 다른 하나는 Name과 컬렉션 내의 색인을 반환하는 것입니다 (가능한 경우). 또 다른 방법은, 오버라이드 동작에 신경 쓰지 않는다면 매번 유일한 Guid을 반환하는 것입니다.

+0

Ahh는 나에게 멍청한 프로그래머이다. 나는 그 일을하고 있다는 것을 결코 알지 못했다. (튜토리얼 사용). 오버라이드 동작에 대해 너무 걱정하지 않아 GUID를 반환하는 것이 좋습니다. 방금 테스트 한 결과 예상대로 작동합니다! 정말 고맙습니다! – jAC

+0

random guess ftw. 또한, 그 클래스들에 관한 문서를 읽는 동안'ConfigurationElementCollectionType.BasicMapAlternate' 열거 형 값도 오버라이드 동작에 묶여 있다고 언급 한 것으로 생각됩니다. 무시할 수없는 값으로 변경하는 것이 좋습니다. 행운을 빕니다! – welegan

+0

할 것입니다! 정말 고맙습니다! – jAC