2012-01-08 2 views
2

리플렉션 기능에 사용할 사용자 정의 속성을 만들어야합니다.타겟이 사용자 정의 속성을위한 인터페이스를 상속하는지 확인하십시오.

  • 를 사용자가 몇 가지 클래스를 만들어 내 특별한 속성 (예를 들어 [ImportantAttribute])
  • 다음 사용자가 함께 무언가를 함께 표시 : 내가보기로 여기

    는 유스 케이스입니다 내 라이브러리의 기능. 이러한 기능은 클래스 [ImportantAttribute] 내 인터페이스 (IMyInterface 상속 표시했다 느릅 나무 것을 [ImportantAttribute]와 클래스를 찾아 내 라이브러리의 기능을 기대하는 이들의 주요 문제는

으로 뭔가를 할 예)에 대한

그가 [ImportantAttribute]와 함께 자신의 클래스를 표시하지 런타임에 컴파일시 IMyInterface을 상속하는 것을 잊지 경우 사용자가 알릴 수있는 방법이 있습니까. 이 속성을 지정하는 몇 가지 방법은 IMyInterface을 상속 한 클래스에만 해당됩니다.

속성 및 필드의 속성과 동일합니다.

+1

왜 사용자가 IMyInterface에서 명시 적으로 상속 된 클래스를 만들 수 없습니까? 나는 '중요한 것'이 파티에 가져온 것이 무엇입니까? –

+0

@Garry Vass이 속성은 내 함수에 대해 표시된 클래스를 집계해야한다고 말합니다.사용자는 IMyInterface를 상속하는 클래스를 만들 수 있으며, 내 함수를 집계하지 않아도됩니다. 그러나 ImportantAttribute로 표시된 모든 클래스는 IMyInterface를 구현해야합니다. – Yavanosta

답변

0

나는 훌륭한 성공으로 구축 한 몇 가지 프레임 워크에서 언급 한 전략을 사용했습니다. 그러한 예는 플러그인 인프라에 메타 데이터를 제공하는 것입니다 :

[AttributeUsage(AttributeTargets.Class, AllowMultiple=false, Inherited=false)] 
public class PluginAttribute : Attribute 
{ 
    public string DisplayName { get; set; } 
    public string Description { get; set; } 
    public string Version { get; set; } 
} 

public interface IPlug 
{ 
    void Run(IWork work); 
} 

[Plugin(DisplayName="Sample Plugin", Description="Some Sample Plugin")] 
public class SamplePlug : IPlug 
{ 
    public void Run(IWork work) { ... } 
} 

이렇게 그래서 내가 그것들을 초기화 및 메타 데이터 속성을 읽을 필요없이 플러그인에 대한 정보를 알아낼 수 있습니다. 그렇게 내 경험에

는 유일한 방법은 내가 모두의 요구 사항을 충족하는지 시행 발견 한 것은 런타임 검사를 수행하고 있는지가 굵은 및 < 깜짝 >이 < 점멸/> 깜박 문서에 확인하는 것입니다 . 그것은 최적과는 거리가 멀지 만 할 수있는 최선의 방법입니다 (제가 발견 한 것). 그럼에도 불구하고 나는 이것을 처리하는 더 좋은 방법이 있다고 확신하지만 지금까지는 이것이 나를 위해 꽤 견고했습니다.

1

그는 [ImportantAttribute]와 함께 자신의 클래스를 표시하지 런타임에, 컴파일시 IMyInterface을 상속하는 것을 잊지 경우 사용자가 알릴 수있는 방법이 있나요

간단한 대답 : 없음, 이건 불가능 해. 컴파일 타임이 아닙니다. 리플렉션을 사용하여 런타임에이를 확인할 수 있습니다.

Obsolete과 같은 일부 특수 시스템 속성을 제외하고 컴파일 타임에 속성을 사용할 수있는 최상의 방법은 [AttributeUsage] 속성을 사용하여 용도를 지정하는 것입니다.

+0

우선 해답을 주셔서 감사합니다. 속성 (클래스 또는 속성)의 사용을 지정할 수 있지만 가능한 한 내 라이브러리를 사용하기가 가장 쉽습니다. 컴파일러 인 우리의 친구이자 사명 - 가능한 한 더 많은 정보를 제공하십시오. 런타임보다 컴파일 타임에 오류가 발생하는 것이 더 편합니다. – Yavanosta

+0

@ Yavanosta, 나는 런타임보다는 컴파일 타임의 안전성을 제공하는 편이 낫겠다고 동의하지만,이 경우에는 리플렉션을 사용하여 런타임에 작동하는 특성을 사용하면 안됩니다. 그래서 당신은 안전을 얻지 못합니다. 어쩌면 당신은 당신의 디자인을 다시 생각해야합니다. –