2013-03-06 7 views
0

"ImageElement : ConfigurationElement"클래스의 요소를 포함하는 "ImageElementCollection : ConfigurationElementCollection"클래스가 있습니다. 나는이의 항목을 액세스 할 때, 그러나이 컬렉션에 개체가 포함 된 것 같습니다.

MonitorConfig Config = (MonitorConfig)ConfigurationManager.GetSection("MonitorConfig"); 

:에 StackOverflow에 여기에 몇 가지 다른 매우 지적인 사람의 조언을 사용

, 나는 내 프로그램에서 이러한 항목을 활용하는 방법을 알아 낸 "이미지"를 대상으로하기보다는 최선의 노력에도 불구하고의 ImageElement로 선언 되었기 때문에 컬렉션 ...

foreach (var image in Config.Images) Debug.WriteLine(image.Name); 

... 나는 Name 속성에서 구불 구불 한 선으로 끝낸다.

내가 내 선언에서 잘못하고있어이 무엇인가, 아니면 거기 그 foreach 문에서 "ImageElement"에 대한 "VAR"를 교환하여이 뭔가 모두가 단지 다루는입니까? 구성 처리기에 대한

코드는 아래의 발견 :

public class MonitorConfig : ConfigurationSection 
{ 
    [ConfigurationProperty("Frequency", DefaultValue = 5D, IsRequired = false)] 
    public double Frequency 
    { 
     get { return (double)this["Frequency"]; } 
    } 

    [ConfigurationProperty("Images", IsRequired = false)] 
    public ImageElementCollection Images 
    { 
     get { return (ImageElementCollection)this["Images"]; } 
    } 
} 

[ConfigurationCollection(typeof(ImageElement), AddItemName = "Image")] 
public class ImageElementCollection : ConfigurationElementCollection 
{ 
    public ImageElement this[object elementKey] 
    { 
     get { return (ImageElement)BaseGet(elementKey); } 
    } 

    public void Add(ImageElement element) 
    { 
     base.BaseAdd(element); 
    } 

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

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

public class ImageElement : ConfigurationElement 
{ 
    [ConfigurationProperty("Name", IsRequired = true, IsKey = true)] 
    public string Name 
    { 
     get { return (string)this["Name"]; } 
    } 
} 
+0

는'ImageElement의 image'에 대한'var에 image'을 전환하십시오. 그것은 모호 할 수 있으며 단지 type 객체로 취급 할 수 있습니다. (편집 : 당신의 foreach에, 나는 분명 아니었다면 ...) EDIT2 : 나는 당신이 이미 일을하고 작동 암시하는 것 같다했습니다 참조하십시오. 그렇다면 나는 "그렇습니다. 주위를 돌아 다니는 방법입니다."라고 말하려고합니다. –

+0

네, 괜찮습니다. 그것은 나에게 이상하게 보입니다. X 형의 * 확실히 * * ("ImageElement"라고 표시된 툴팁에 "var"로 선언 할 때와 같이 입력되지 않습니다.) 내 처리기가 망가 졌다고 생각 했을까? –

+3

ConfigurationElementCollection은 ICollection 및 IEnumerable을 구현합니다. ICollection 및 IEnumerable은 요소 형식에 대한 힌트가 없으므로 기본적으로 Object 형식의 요소를 제공합니다. 컬렉션이 generic interface IEnumerable 을 구현하면 컴파일러는 var 대신 T를 사용해야한다고 결정할 수 있습니다. –

답변

2

앤드류 캐넌은 위의 코멘트에 대한 답을 제공 :이 컬렉션은 IEnumerable을 <T> 구현하지 않기 때문에 단지 객체를 포함 할 것으로 보인다.

또한, 약간 처리기 구성을 조절함으로써 그 문제를 해결하는 것이 가능하다. 클래스의 본문에 어느 정도이 같은 방법을 다음과 같이 간단하게 ...

public class ImageElementCollection : ConfigurationElementCollection, IEnumerable<ImageElement> 

을 IEnumerable 인터페이스를 추가 ... 그리고 스틱 :

public new IEnumerator<ImageElement> GetEnumerator() 
{ 
    var iter = base.GetEnumerator(); 
    while (iter.MoveNext()) yield return (ImageElement)iter.Current; 
} 

이, 앤드류 감사합니다.

+0

(Btw, 원한다면 ... 대답, 나는 너의 것을 고를 것이다. : P) –

관련 문제