2010-12-06 2 views
4

디자인 타임에이 값의 유형과 수를 알 수는 없지만 임의의 수의 유형을 보유 할 수있는 클래스를 설계해야합니다. 예를 들어, 2 int와 1 int 또는 long 또는 int 값으로 클래스를 초기화 할 수 있습니다. 나는 또한 가능한 한 멀리 복싱을 피하고 싶습니다 ('개체'형식을 사용하여). 각 유형은 이름이 것 때문에 값을 유지하는 내부 사전알 수없는 유형의 매개 변수에 대한 클래스 디자인

Dictionary<string,object> nameValues;//Boxing! 

처럼 보일 수 있고

MyClass(params object[] values) { ... } 

내가이

MyClass mc = new MyClass("intVal",3,"doubleVal",3.5,"dateTimeVal",DateTime.Now); 
같은 인스턴스를 생성 할 수처럼 생성자는 볼 수 있었다

가능한 한 멀리 복싱을 피할 수있는보다 효율적인 디자인에 대한 제안.

편집 : 'string'값을 매개 변수로 지정할 수도 있습니다. 처음에는 값 유형 만 언급했지만 더 이상 그렇지 않습니다!

+0

를 사용하여 아래에 같은 수 있습니다 권투를 사용하여. 다른 한편으로, 당신이하고 싶은 것을 우리에게 말하면 누군가는 더 나은 해결책을 제시 할 것입니다. – decyclone

+0

값 유형 매개 변수에 제한이 있습니다. 즉, 2,3,4,5 – TalentTuner

+0

@decyclone 실제로 제가 말한 바를 달성하고 싶습니다. 각 값 유형에 관련 이름이있는 값 유형의 임의의 개수에 대해 효율적인 컨테이너를 설계하고 싶습니다. . – alwayslearning

답변

2

개인적으로 나는 약간의 권투를 두려워하지 않을 것이다; 당신이 프로파일 링하고 그것이 문제라고 증명하지 않는 한, 이것은 아마도 당신의 문제 중 가장 적은 것일 것입니다. 그러나 어떻게 익명 형에 대해 :

var mc = new { intVal = 3, doubleVal = 3.5, dateTimeVal = DateTime.Now }; 

유일한 문제는이 방법의 외부가 밖으로 다시이 값을 얻을 수있는 유일한 방법은 반사를 통해 것입니다. 어떤 반드시 문제가되지 않습니다. 그러나 많은면에서 Dictionary<string,object>은 (과체중 인 반면) 훨씬 간단합니다. 당신이 사전에 가능한 유형을 알고 있다면

2

당신은 다시 값을 읽을 때 다음 권투를하지 않아도 각 유형에 대해 별도의 사전을 사용할 수 있습니다,이

Dictionary<string, ValueType> x = new Dictionary<string, ValueType>(); 
x.Add("1",1); 
x.Add("2", 23.33m); 
x.Add("3", new MyStruct()); 
x.Add("4", new object()); // compile-time error 
+0

을 참조하십시오. '문자열'값도 허용되므로 사전에 'ValueType'을 사용할 수 없음을 지적했습니다. – alwayslearning

+0

문자열은 값 형식이 아니므로 –

+3

형식의 'ValueType'은 (아마도 혼란스럽게) boxed 될 수 없습니다. –

2

을 시도합니다. 예를 들어, 기존의 코드 구조를 사용하여

:

class MyClass 
{ 
    private Dictionary<string, int> intValues = new Dictionary<string, int>(); 
    private Dictionary<string, double> doubleValues = new Dictionary<string, double>(); 
    private Dictionary<string, DateTime> dateTimeValues = new Dictionary<string, DateTime>(); 

    public MyClass(params object[] values) 
    { 
     if (values.Length % 2 != 0) 
      throw new ArgumentException("invalid values!", "values"); 
     for (int i = 0; i < values.Length; i += 2) 
     { 
      string key = values[i].ToString(); 
      object value = values[i + 1]; 
      if (value is int) 
       intValues.Add(key, (int)value); 
      else if (value is double) 
       doubleValues.Add(key, (double)value); 
      else if (value is DateTime) 
       dateTimeValues.Add(key, (DateTime)value); 
     } 
    } 
} 
0

난 당신없이이 작업을 수행 할 수있는 방법을 볼 수 없습니다

public class ValueHolder 
{ 
    public ValueType[] Values { get; set; } 
    public string[] NonValueType { get; set; } 
} 

public class SomeValueType<T> where T:ValueHolder 
{ 
    Dictionary<string, T> tempDict = new Dictionary<string, T>(); 


    public SomeValueType(T val,string keyName) 
    { 
     if(!tempDict.Keys.Contains(keyName)) 
      tempDict.Add(keyName, val); 
    } 

} 

 ValueType[] arr = new ValueType[] { 1, 1.1, DateTime.Now }; 
     ValueHolder vh = new ValueHolder(); 
     vh.Values = arr; 
     vh.NonValueType = new string[] { "temp", "s" }; 
     SomeValueType<ValueHolder> temp = new SomeValueType<ValueHolder>(vh, "key"); 
+1

'ValueType'으로 캐스팅은 실제로 복싱 작업입니다. –

+0

@Marc : 감사합니다. Marc : 이것을 설명해 주시겠습니까? 실제로 이것을 설명하는 링크를 게시 할 수 있습니까? 아직까지는 잘못된 가정이었습니다. – TalentTuner

+0

좋은 참고 자료가 없습니다. 수작업으로 처리하지만, 컴파일 타임에 구조체로 취급 할 수있는 구체적인 유형 *을 알고있을 때만 가능합니다. 아마도'ValueType' 자체가'클래스'라는 사실은 당신에게 충분한 증거 일 것입니다; 그렇지 않으면 일리노이 주에서 상자 작동을 살펴보십시오. –

관련 문제