문제

다음 코드를 보았습니다.

[DefaultValue(100)]
[Description("Some descriptive field here")]
public int MyProperty{...} 

위의 Snippit의 기능은 충분히 명확 해 보입니다. 유용한 작업을 수행하기 위해 어떻게 사용할 수 있는지 전혀 모릅니다. 나는 어떤 이름을 줄지 확실하지 않습니다!

이 속성 속성에 대한 자세한 정보/자습서를 어디에서 찾을 수 있는지 아는 사람이 있습니까? 또한이 기능이 할 수있는 새로운 / 유용한 작업에도 관심이 있습니다.

도움이 되었습니까?

해결책

사람들은 이미 UI 측면을 다루었습니다. 속성에는 다른 용도가 있습니다. 예를 들어, 대부분의 직렬화 프레임 워크에서 광범위하게 사용됩니다. 일부 속성은 컴파일러에 의해 특별한 치료를받습니다 (예 : [PrincipalPermission(...)] 방법에 선언적 보안을 추가하여 사용자가 적절한 액세스 권한이 있는지 (자동으로) 확인할 수 있습니다.

자신만의 특별 취급을 추가하려면 사용할 수 있습니다. 포스트 쇼트; PostSharp를 사용하여 로깅과 같은 AOP를 수행하거나 자동적 인 INotifyPropertyChanged 구현.

다른 팁

위의 Snippit의 기능은 충분히 분명해 보입니다.

아마도 많은 사람들이 [defaultValue () 세트 재산의 가치. 실제로, 일부 시각적 디자이너 (예 : Visual Studio)에게 코드가 기본값을 설정하는 내용을 알려주는 것은 모든 일입니다. 그렇게 알고 있습니다 굵게 속성 창의 값이 다른 것으로 설정된 경우 값.

예제의 것들은 비주얼 디자이너 (예 : MS Expression Blend 및 Visual Studio Designer)가 디자이너 UI에 힌트를 제공하는 데 사용됩니다.

그것들은 메타 데이터이며 속성 논리에 영향을 미치지 않습니다. 환경 DefaultValue 예를 들어 기본적으로 속성을 해당 값으로 설정하지 않으므로 수동으로 수행해야합니다.

어떤 이유로이 속성에 액세스하고 싶다면 반사를 사용하십시오.

보다 MSDN 디자이너 속성에 대한 자세한 내용은

그것들은 속성이라고하며, MSDN에는 많은 정보가 있습니다. http://msdn.microsoft.com/en-us/library/z0w1kczw.aspx

일반적으로 그들은 스스로 아무것도 "행동"하지 않으며, 수업을 사용할 다른 코드에서 사용됩니다. XMLSerialization은 좋은 예입니다. XMLSERIALIZER (프레임 워크의 일부로 Microsoft가 제공 함)는 거의 모든 클래스 (클래스에 여러 가지 요구 사항이 있습니다) - 반사를 사용하여 클래스에 포함 된 데이터를 확인할 수 있습니다. 속성 (xmlserializer와 함께 정의)을 사용하여 xmlserializer가 클래스를 직렬화하는 방식을 변경할 수 있습니다 (예 : 데이터를 요소 대신 속성으로 저장하도록 지시).

특정 유형의 인스턴스를 구성하기 위해로드 해야하는 그래픽 디자이너를 정의하는 데 사용합니다.

즉, 우리는 어셈블리에서 가능한 모든 명령 유형을로드하는 일종의 워크 플로 디자이너가 있습니다. 이 명령 유형에는 구성 해야하는 속성이 있으므로 모든 명령 유형은 다른 디자이너 (USERCONTROL)가 필요합니다.

예를 들어 다음 명령 유형을 고려하십시오 (솔루션의 복합재라고 함)

[CompositeMetaData("Delay","Sets the delay between commands",1)]
[CompositeDesigner(typeof(DelayCompositeDesigner))]
public class DelayComposite : CompositeBase 
{
       // code here
}

이것은 정보가 두 곳에서 사용됩니다

1) 디자이너가 명령 목록을 작성하면 compositemetAdata를 사용하여 명령에 대한 자세한 정보를 표시합니다.

2) 사용자가 디자이너에 명령을 추가하고 디자이너가 해당 클래스의 인스턴스를 작성하면 CompositedESigner 속성을보고 지정된 유형 (USERCONTROL)의 새 인스턴스를 생성하고 비주얼 디자이너에 추가합니다.

다음 코드를 고려하십시오. 우리는 명령을 "도구 모음"에로드하는 데 사용합니다.

foreach (Type t in assembly.GetExportedTypes())  
{
    Console.WriteLine(t.Name);

    if (t.Name.EndsWith("Composite"))
    {
        var attributes = t.GetCustomAttributes(false);
        ToolboxListItem item = new ToolboxListItem();

        CompositeMetaDataAttribute meta = (CompositeMetaDataAttribute)attributes
                              .Where(a => a.GetType() == typeof(Vialis.LightLink.Attributes.CompositeMetaDataAttribute)).First();
        item.Name = meta.DisplayName;
        item.Description = meta.Description;
        item.Length = meta.Length;
        item.CompositType = t;

        this.lstCommands.Items.Add(item);
    }                           
}

보시다시피, 이름이 "composite"로 끝나는 어셈블리의 모든 유형에 대해 사용자 정의 속성을 가져 와서 해당 정보를 사용하여 ToolboxListItem 인스턴스를 채 웁니다.

디자이너를로드하는 것은 속성이 다음과 같이 재고됩니다.

var designerAttribute = (CompositeDesignerAttribute)item.CompositType.GetCustomAttributes(false)
                         .Where(a => a.GetType() == typeof(CompositeDesignerAttribute)).FirstOrDefault();

이것은 사용자 정의 속성을 어떻게 사용할 수 있는지에 대한 한 가지 예일뿐입니다.

나는 이것이 당신에게 시작할 장소를 제공하기를 바랍니다.

이러한 속성은 설계 시간 경험을 사용자 정의합니다.

http://msdn.microsoft.com/en-us/library/a19191fh.aspx

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top