문제

여기에 문제가 있습니다. 구성 데이터가 포함 된 클래스를 만들고 싶습니다. 이 데이터는 키/값 쌍으로 구성됩니다. 몇 가지 예 : "hostname"= "localhost", "timeout"= 1000 등 .. 나의 초기 아이디어는이 모든 것을 일반 사전에 저장하는 것이 었습니다.

private Dictionary<string, ConfigurationItem<object>> Configuration = 
    new Dictionary<string, ConfigurationItem<object>>();

그리고 configurationItem 클래스는 다음과 같습니다.

public class ConfigurationItem<T>
{
    public string Name { get; set; }
    public T Value { get; set; }
}

내 희망은 구성을 다음과 같이 쿼리하고 설정할 수 있기를 희망합니다.

int i = Configuration.Get<int>("Timeout");
Configuration.Set("Timeout", 1000);

불행히도 다음 코드를 사용하여 구성 사전에 항목을 삽입 할 수 없습니다.

public void SetValue<T>(string key, ConfigurationItem<T> value)
{
        if (Configuration.ContainsKey(key.ToUpper()))
            Configuration[key.ToUpper()] = **value**;
        else
            Configuration.Add(key.ToUpper(),  **value**);
}

대담한 부품은 오류를 나타냅니다.

유형 configurationItem을 변환 할 수 없습니다u003CT> configurationItemu003CObject>

새로운 분산 기능을 사용 하여이 문제를 해결하기를 희망했지만 지금까지는 C# 4.0을 사용하고 있습니다. 더 많은 정보가 필요한 경우 이름을 지정하십시오! 당신의 도움을 주셔서 감사합니다!

도움이 되었습니까?

해결책

사전을 개인 사전으로 정의 할 수 있습니다u003Cstring, object> get 메소드에서 반환하기 전에 물체를 캐스팅하십시오.

다른 팁

C# 4.0의 공분산 및 비밀화는 인터페이스 및 대표에만 적용됩니다.

유형 매개 변수를 다음과 같이 접두사해야합니다 in 또는 out, 인터페이스 멤버의 정의에서 유형 매개 변수의 사용 위치에 따라

예를 들어:

public interface IConfigurationItem<out T>
{
    public string Name { get; set; }
    public T Value { get; set; }
}

왜냐하면 IDictionary<TKey,TValue> 입력 및 출력에 유형 매개 변수를 모두 사용하면 사전은 공분산이 아니거나 비밀리가 아닙니다.

C# 4.0 드래프트 사양 분산 제한에서

23.3 제한 사항 공동 및 비밀화 유형 매개 변수는 인터페이스 및 대표 유형에서만 선언 할 수 있습니다. 공동 및 분열은 유형 인수 사이에 참조 (또는 신원) 변환이있을 때만 적용됩니다. 예를 들어, an IEnumerable<int> 아닙니다 IEnumerable<object> int에서 객체로의 변환은 참조 변환이 아니라 권투 변환이기 때문입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top