2008-10-16 2 views
14

속성 :C#을 속성은 내가 다음 코드를 보았다

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

위 SNIPPIT에서 기능이 충분히 명확 보인다, 내가 유용한 일을하는 데 사용할 수있는 방법에 대한 아무 생각이 없습니다. 심지어 그것을 줄 이름이 무엇인지 확실하지 않습니다.

누구든지이 속성 속성에 대한 자세한 정보/자습서를 어디에서 찾을 수 있습니까? 이 기능이 할 수있는 모든 소설/유용한 작업에도 관심이 있습니다.

답변

13

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

특별한 처리 방법을 추가하려면 PostSharp을 사용할 수 있습니다. PostSharp를 사용하여 로깅과 같은 AOP 작업을 수행하거나 또는 코드 단순화 (예 :)의 많은 훌륭한 예가 있습니다.

6

것들은 UI 디자이너에 힌트를 제공하기 위해 비주얼 디자이너 (즉 MS 식 블렌드 및 비주얼 스튜디오 설계자)에 의해 사용된다.

메타 데이터이므로 속성 논리에 영향을주지 않습니다. 예를 들어 DefaultValue으로 설정하면 기본적으로 속성이 해당 값으로 설정되지 않으므로 수동으로 설정해야합니다.

어떤 이유로 이러한 속성에 액세스하려면 use reflection이 필요합니다.

디자이너 특성에 대한 자세한 내용은 MSDN을 참조하십시오.

+0

Visual Studio 디자이너에서도 사용됩니다. –

+0

그리고 이것들은 힌트 일뿐입니다. 코드에서 MyPoperty의 기본값을 100으로 설정해야합니다. 그렇지 않으면 재산 소비자에게 거짓말을하게됩니다. –

6

속성이라고합니다. msdn에 많은 정보가 있습니다 (예 : http://msdn.microsoft.com/en-us/library/z0w1kczw.aspx

일반적으로 독자적으로 "수행"하지 않으며 클래스를 사용하는 다른 코드에서 사용합니다. XmlSerialization은 좋은 예입니다. XmlSerializer (프레임 워크의 일부로 Microsoft에서 제공)는 거의 모든 클래스에서 사용할 수 있습니다 (클래스에 많은 요구 사항이 있습니다). 리플렉션을 사용하여 클래스에 포함 된 데이터를 확인합니다. 특성 (XmlSerializer와 함께 정의 됨)을 사용하여 XmlSerializer에서 클래스를 serialize하는 방식을 변경할 수 있습니다 (예 : 요소 대신 데이터를 특성으로 저장하도록 지정).

27

위 SNIPPIT의 기능은

는 어쩌면, 많은 사람들이 생각하는, 충분히 명확 보인다 [의 DefaultValue()] 세트 속성 값. 실제로 시각적 디자이너 (예 : Visual Studio)에게 기본 값을 설정하는 코드를 알려주는 것입니다. 그렇게하면 굵게 속성 창이 다른 값으로 설정된 경우 그 값을 알 수 있습니다.

+0

그래서 MyProperty를 명시 적으로 다른 값으로 설정하지 않은 경우 양식 디자이너 (또는 Equivelent)가 MyProperty를 100이면 장면 뒤에 설정합니까? –

+3

NO! 명시 적으로 MyProperty를 값으로 설정하지 않으면 기본값으로 0이됩니다 (백업 저장소가 있다고 가정). 양식 디자이너는 "0"으로 값을 표시하지만 굵게 표시되어 기본값에서 수동으로 변경되었습니다. 폼 디자이너의 값 모양에만 영향을줍니다. –

+0

아, 그건 이해가됩니다. 감사! –

3

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

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

는 예를 들어,

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

이 정보는 두 곳

1

)에 사용된다 (우리의 솔루션에 복합라고 함) 다음 명령 유형을 고려 CompositeMetaData 을 사용하여 명령에 대한 추가 정보를 표시합니다. 사용자가 디자이너에 명령을 추가하고 디자이너가 해당 클래스의 인스턴스가, 그것은 CompositeDesigner 속성에 보이는 만들 때

2), 지정된 유형 (UserControl을)의 새로운 인스턴스를 생성에 를 추가합니다 비주얼 디자이너.

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

당신이 볼 수 있듯이, 이름은 "복합" 로 끝나는있는 어셈블리의 모든 유형에 대한 사용자 지정 특성을 가져 와서이 정보를 사용하여 ToolboxListItem 인스턴스를 채 웁니다.

은 디자이너를로드에 관해서는, 속성은 다음과 같이 입수해온된다

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

이이 당신을 제공합니다 사용자 정의 속성을 사용할 수있게하는 방법의 한 예를 들면, 나는 희망

입니다 시작할 장소.

관련 문제