2014-06-10 7 views
3

클래스 FooBar 있습니다. 내 코드베이스 전체에서이 클래스를 사용하고 깨끗하게 유지하려고합니다. 저는 현재 FooBars와 값 목록을 가지고있는 방식으로 FooBar와 작업하고 있습니다. 목록을 반복하고 FooBar 요소와 값을 일치시켜야합니다. 하나의 FooBar에 여러 값이 연결됩니다. 이 목록에 값을 추가 할 수 있도록 임시로 FooBar 객체에 목록을 추가 할 수있는 방법이 있습니까? 이런 식으로 뭔가 :C#의 개체에 동적으로 속성을 추가 할 수 있습니까?

List <FooBar> myFoos = GetFoos(); 
List <int> values = GetValues(); 
foreach (var value in values) 
{ 
    foreach (var foo in myFoos) 
    { 
     if (CheckMatch(foo, value)) 
     { 
      if (foo.tempList == null) 
      { 
       foo.tempList = new List<int>(); 
      } 
      foo.tempList.Add(value); 
     } 
    } 
} 
//... 
//do things with the list of values on each FooBar 

는 지금 내가 대신 < FOOBAR, 목록 < INT >>의 새로운 사전을 만드는거야. 사전을 만드는 것이 올바른 방법일까요? 아니면 내가 위에 올린 것과 비슷한 것을 할 수 있습니까?

+0

튜플을 사용할 수 있습니다. –

+0

FooBar에 List 의 내부 또는 비공개 자산을 만들면 어떨까요? – Gusman

+0

나는 사전이 여기 갈 길이라고 말하고 싶다. 그것은 당신이 묘사하는 관계를 모델링하는 분명한 방법입니다. – Rik

답변

2

ExpandoObject을 사용할 수 있습니다. 실제로는 Dictionary<string, object> 이상입니다.

dynamic instance = new ExpandoObject(); 
instance.tempList = new List<int>(); 

instance.tempList.Add(1); 

당연히 임시 Dictionary<FooBar, List<int>>을 사용하는 것이 쉽습니다.

1

필요한 옵션에 따라 몇 가지 옵션이 있습니다. Dictionary<FooBar, List<int>> 또는 Dictionary<FooBar, HashSet<int>> 중 하나를 사용할 수 있습니다. 또는 HashSet<KeyValuePair<FooBar, int>>을 사용할 수 있습니다.

모든 제약 조건에 따라 다릅니다.

아마도 전체 코드를 더 작게 만들기 위해 제안 된 유형 중 하나에서 파생 된 클래스를 만들어야합니다.

0

아니요, 객체에 속성을 동적으로 추가 할 수 없습니다. 내가하는 일이 무엇인지 알 수 없다. 내가하는 일을 모르기 때문에 최선의 방법이다. 이 코드의 사용 위치와 방법에 대해 설명해 주시면 더 나은 대답을 드릴 수 있습니다.

0

by using Reflection을 원한다면 동적 속성을 만들 수 있지만 문제에 대한 최선의 방법은 아닙니다.

코드베이스 전체에 사용 된 클래스가 있고 값 목록과 일치시켜야하지만이 값을 보유 할 수있는 용량이 부족하면 디자인을 다시 생각해야합니다. 이 값을 가져 오는 위치에 따라 FooBar의 특정 인스턴스에 대한 참조를 가져 오거나 FooBar에서 상속하거나 이러한 값을 보유한 클래스를 고려한 다음 FooBar 인스턴스에서 id 속성을 가져올 수 있습니다.

관련 문제