C# 4.0에서 분산을 사용하는 데 도움이됩니다
문제
여기에 문제가 있습니다. 구성 데이터가 포함 된 클래스를 만들고 싶습니다. 이 데이터는 키/값 쌍으로 구성됩니다. 몇 가지 예 : "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에서 객체로의 변환은 참조 변환이 아니라 권투 변환이기 때문입니다.