2012-04-30 4 views
2

MEF의 일부인 사용자 정의 속성을 만들었습니다. 여기에서 클래스와 관련된 ID 목록을 정의하여 쿼리 할 수 ​​있습니다. 시스템 속성에 목록 추가

는 또한 클래스는 자체 내에서 정의를 포함하는이 내가 사용에 대해 생각하는 이유가 중요하다

[SignalSystemData("ServiceIds", new List<int>(){1})] 

어떻게 진행해야한다?

다음과 같이 검색 내 구현은 다음과 같습니다 정의와

 var c = new Class1(); 
     var v = c.EditorSystemList; 

     foreach (var lazy in v.Where(x=>x.Metadata.LongName=="ServiceIds")) 
     { 
      if (lazy.Metadata.ServiceId.Contains(serviceIdToCall)) 
      { 
       var v2 = lazy.Value; 
       // v2 is the instance of MyEditorSystem 
       Console.WriteLine(serviceIdToCall.ToString() + " found"); 

      }else 
      { 
       Console.WriteLine(serviceIdToCall.ToString() + " not found"); 
      } 
     } 

내 수출 클래스는 다음과 같아야합니다

[Export(typeof(IEditorSystem))] 
[SignalSystemData("ServiceIds", new List<int>{1})] 
public class MyEditorSystem1 : IEditorSystem 
{ 
    void test() 
    { 
     Console.WriteLine("ServiceID : 1"); 
    } 
} 


public interface IEditorSystem 
{ 
} 

[MetadataAttribute] 
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] 
public class SignalSystemDataAttribute : ExportAttribute 
{ 
    public SignalSystemDataAttribute(string longName, List<int> serviceId) 
     : base(typeof (IEditorSystem)) 
    { 
     LongName = longName; 
     ServiceId = serviceId; 
    } 

    public string LongName { get; set; } 
    public List<int> ServiceId { get; set; } 

} 

public interface IEditorSystemMetadata 
{ 
    string LongName { get; } 
    List<int> ServiceId { get; } 
} 
+0

비행하지 않습니다. [특성 값은 (컴파일 시간) 상수 여야합니다]. (http://msdn.microsoft.com/en-us/library/yd21828z.aspx) –

+0

@ Christian.K 내가 아는 바로는 그래서 나는 찾으려고합니다. 방법은, 코마 분리 한 끈을 사용하기 위하여 의지없이. – cpoDesign

+0

아, 죄송합니다. 질문에 그 사실을 표시하고 싶을 수도 있습니다. 또한 내 대답. –

답변

0

는 컴파일 타임 상수 문제를 해결하기 위해, 다음과 같은 한 선택 :

  • 특별히 형식이 지정된 문자열 (예 : 이미 쉼표로 구분 된 정수 목록)을 사용하십시오. uggested).
  • 각기 다른 ID 수의 오버로드를 사용하십시오. 전달할 ID가 너무 많으면 지저분해질 것입니다.
  • params int[] ids을 생성자의 마지막 인수로 사용하십시오. 이 방법은 작동하지만 CLS와 호환되지 않습니다.
  • 가장 쉬운 방법은 배열 int [] 인수를 사용하는 것입니다.

물론 위의 조합을 사용할 수도 있습니다. 오버로드 인수가 충분하지 않은 (잘하면) 구석의 경우에 1 ~ 5 개의 ID 인수를 사용하고 문자열 인수 또는 params int[] 인수를 제공하는 오버로드가 두 개 있습니다.

업데이트 : 그냥 찾았습니다 this 질문/답변. 중복 될 수는 없지만 같은 문제를 다루고 있습니다 (주로).

+0

thnx 그것이 내가 찾고있는 것입니다. – cpoDesign