문제

.NET의 특성은 무엇이고, 어떤 용도로 유용하며, 고유한 특성을 만들려면 어떻게 해야 합니까?

도움이 되었습니까?

해결책

메타데이터.개체/메서드/속성에 대한 데이터입니다.

예를 들어 다음과 같은 속성을 선언할 수 있습니다.DisplayOrder를 사용하면 UI에 표시되는 속성의 순서를 쉽게 제어할 수 있습니다.그런 다음 이를 클래스에 추가하고 속성을 추출하고 UI 요소를 적절하게 정렬하는 일부 GUI 구성 요소를 작성할 수 있습니다.

public class DisplayWrapper
{
    private UnderlyingClass underlyingObject;

    public DisplayWrapper(UnderlyingClass u)
    {
        underlyingObject = u;
    }

    [DisplayOrder(1)]
    public int SomeInt
    {
        get
        {
            return underlyingObject .SomeInt;
        }
    }

    [DisplayOrder(2)]
    public DateTime SomeDate
    {
        get
        {
            return underlyingObject .SomeDate;
        }
    }
}

따라서 사용자 정의 GUI 구성 요소로 작업할 때 SomeDate 앞에 SomeInt가 항상 표시되도록 합니다.

그러나 직접 코딩 환경 외부에서 가장 일반적으로 사용되는 것을 볼 수 있습니다.예를 들어 Windows 디자이너는 이를 광범위하게 사용하므로 사용자 정의된 개체를 처리하는 방법을 알 수 있습니다.다음과 같이 BrowsableAttribute를 사용합니다.

[Browsable(false)]
public SomeCustomType DontShowThisInTheDesigner
{
    get{/*do something*/}
}

예를 들어 디자인 타임에 속성 창의 사용 가능한 속성에 이를 나열하지 않도록 디자이너에게 지시합니다.

~할 수 있었다 또한 코드 생성, 사전 컴파일 작업(예: Post-Sharp) 또는 Reflection.Emit과 같은 런타임 작업에도 사용할 수 있습니다.예를 들어, 코드에서 수행하는 모든 단일 호출과 시간을 투명하게 래핑하는 프로파일링을 위한 약간의 코드를 작성할 수 있습니다.특정 메소드에 배치한 속성을 통해 타이밍을 "선택 해제"할 수 있습니다.

public void SomeProfilingMethod(MethodInfo targetMethod, object target, params object[] args)
{
    bool time = true;
    foreach (Attribute a in target.GetCustomAttributes())
    {
        if (a.GetType() is NoTimingAttribute)
        {
            time = false;
            break;
        }
    }
    if (time)
    {
        StopWatch stopWatch = new StopWatch();
        stopWatch.Start();
        targetMethod.Invoke(target, args);
        stopWatch.Stop();
        HandleTimingOutput(targetMethod, stopWatch.Duration);
    }
    else
    {
        targetMethod.Invoke(target, args);
    }
}

선언하는 것은 쉽습니다. Attribute에서 상속되는 클래스를 만드세요.

public class DisplayOrderAttribute : Attribute
{
    private int order;

    public DisplayOrderAttribute(int order)
    {
        this.order = order;
    }

    public int Order
    {
        get { return order; }
    }
}

그리고 속성을 사용할 때 접미사 "속성"을 생략할 수 있다는 점을 기억하세요. 컴파일러가 이를 추가해 줍니다.

메모: 속성은 그 자체로는 아무 것도 하지 않습니다. 속성을 사용하는 다른 코드가 필요합니다.때로는 해당 코드가 사용자를 위해 작성되었지만 때로는 직접 작성해야 하는 경우도 있습니다.예를 들어, C# 컴파일러는 일부 및 특정 프레임워크 프레임워크가 일부를 사용하는 것에 관심을 갖습니다(예:NUnit은 어셈블리를 로드할 때 클래스에서 [TestFixture]를 찾고 테스트 메서드에서 [Test]를 찾습니다.
따라서 자신만의 사용자 정의 속성을 생성할 때 코드 동작에 전혀 영향을 미치지 않는다는 점에 유의하세요.(리플렉션을 통해) 속성을 확인하고 그에 따라 조치를 취하는 다른 부분을 작성해야 합니다.

다른 팁

많은 분들이 답변해주셨는데 아직까지 아무도 언급하지 않으셨네요...

속성은 리플렉션과 함께 많이 사용됩니다.반사가 이미 꽤 느립니다.

그것은 매우 가치 있는 사용자 정의 속성을 다음으로 표시 sealed 런타임 성능을 향상시키는 클래스입니다.

이러한 속성을 어디에 사용하는 것이 적절한지 고려하고 속성(!)을 지정하여 이를 표시하는 것도 좋은 생각입니다. AttributeUsage.사용 가능한 속성 사용 목록을 보면 다음과 같이 놀랄 수 있습니다.

  • 집회
  • 기준 치수
  • 수업
  • 구조체
  • 열거형
  • 건설자
  • 방법
  • 재산
  • 필드
  • 이벤트
  • 상호 작용
  • 매개변수
  • 대리자
  • 반환 값
  • 일반 매개변수
  • 모두

AttributeUsage 속성이 AttributeUsage 속성 서명의 일부라는 점도 좋습니다.와, 순환 의존성이라니!

[AttributeUsageAttribute(AttributeTargets.Class, Inherited = true)]
public sealed class AttributeUsageAttribute : Attribute

속성은 클래스 태깅을 위한 일종의 메타데이터입니다.이는 예를 들어 도구 모음에서 컨트롤을 숨기기 위해 WinForms에서 자주 사용되지만, 다른 클래스의 인스턴스가 특정 방식으로 작동할 수 있도록 자체 애플리케이션에서 구현할 수도 있습니다.

속성을 생성하여 시작하십시오.

[AttributeUsage(AttributeTargets.Class, AllowMultiple=false, Inherited=true)]
public class SortOrderAttribute : Attribute
{
    public int SortOrder { get; set; }

    public SortOrderAttribute(int sortOrder)
    {
        this.SortOrder = sortOrder;
    }
}

모든 속성 클래스가 유효하려면 접미사 "속성"이 있어야 합니다.
이 작업이 완료되면 해당 특성을 사용하는 클래스를 만듭니다.

[SortOrder(23)]
public class MyClass
{
    public MyClass()
    {
    }
}

이제 특정 수업을 확인할 수 있습니다' SortOrderAttribute (있는 경우) 다음을 수행합니다.

public class MyInvestigatorClass
{
    public void InvestigateTheAttribute()
    {
        // Get the type object for the class that is using
        // the attribute.
        Type type = typeof(MyClass);

        // Get all custom attributes for the type.
        object[] attributes = type.GetCustomAttributes(
            typeof(SortOrderAttribute), true);

        // Now let's make sure that we got at least one attribute.
        if (attributes != null && attributes.Length > 0)
        {
            // Get the first attribute in the list of custom attributes
            // that is of the type "SortOrderAttribute". This should only
            // be one since we said "AllowMultiple=false".
            SortOrderAttribute attribute = 
                attributes[0] as SortOrderAttribute;

            // Now we can get the sort order for the class "MyClass".
            int sortOrder = attribute.SortOrder;
        }
    }
}

이에 대해 더 자세히 알고 싶다면 언제든지 확인해 보세요. MSDN 꽤 좋은 설명이 있습니다.
이것이 당신에게 도움이 되었기를 바랍니다!

특성은 코드의 개체에 적용할 수 있는 일부 기능을 포함하는 클래스입니다.하나를 만들려면 System.Attribute에서 상속되는 클래스를 만듭니다.

그들이 좋은 것에 관해서는 ...그 용도는 거의 무한합니다.

http://www.codeproject.com/KB/cs/dotnetattributes.aspx

특성은 클래스, 메서드 또는 어셈블리에 적용되는 메타데이터와 같습니다.

그것들은 여러 가지 작업에 적합합니다(디버거 시각화, 쓸모 없는 것으로 표시, 직렬화 가능으로 표시 등 목록은 끝이 없습니다).

나만의 사용자 정의 항목을 만드는 것은 아주 쉽습니다.여기에서 시작하세요:

http://msdn.microsoft.com/en-us/library/sw480ze8(VS.71).aspx

현재 작업 중인 프로젝트에는 다양한 종류의 UI 객체 세트와 이러한 객체를 조합하여 기본 애플리케이션에서 사용할 페이지를 생성하는 편집기가 있습니다. 이는 DevStudio의 양식 디자이너와 약간 비슷합니다.이러한 객체는 자체 어셈블리에 존재하며 각 객체는 다음에서 파생된 클래스입니다. UserControl 사용자 정의 속성이 있습니다.이 속성은 다음과 같이 정의됩니다.

[AttributeUsage (AttributeTargets::Class)]
public ref class ControlDescriptionAttribute : Attribute
{
public:
  ControlDescriptionAttribute (String ^name, String ^description) :
    _name (name),
    _description (description)
  {
  }

  property String ^Name
  {
    String ^get () { return _name; }
  }

  property String ^Description
  {
    String ^get () { return _description; }
  }

private:
  String
    ^ _name,
    ^ _description;
};

그리고 이를 다음과 같은 클래스에 적용합니다.

[ControlDescription ("Pie Chart", "Displays a pie chart")]
public ref class PieControl sealed : UserControl
{
  // stuff
};

이전 포스터에서 말한 내용입니다.

속성을 사용하려면 편집기에 Generic::List <Type> 컨트롤 유형이 포함되어 있습니다.사용자가 페이지에서 끌어서 놓아 컨트롤의 인스턴스를 만들 수 있는 목록 상자가 있습니다.목록 상자를 채우려면 ControlDescriptionAttribute 컨트롤에 대해 목록에 항목을 입력합니다.

// done for each control type
array <Object ^>
  // get all the custom attributes
  ^attributes = controltype->GetCustomAttributes (true);

Type
  // this is the one we're interested in
  ^attributetype = ECMMainPageDisplay::ControlDescriptionAttribute::typeid;

// iterate over the custom attributes
for each (Object ^attribute in attributes)
{
  if (attributetype->IsInstanceOfType (attribute))
  {
    ECMMainPageDisplay::ControlDescriptionAttribute
      ^description = safe_cast <ECMMainPageDisplay::ControlDescriptionAttribute ^> (attribute);

    // get the name and description and create an entry in the list
    ListViewItem
      ^item = gcnew ListViewItem (description->Name);

    item->Tag = controltype->Name;
    item->SubItems->Add (description->Description);

    mcontrols->Items->Add (item);
    break;
  }
}

메모:위의 것은 C ++/CLI이지만 C#으로 변환하는 것은 어렵지 않습니다 (예, C ++/CLI는 가증 한 것이지만 다음과 같이 작업 해야하는 것입니다 :-()

대부분의 항목에 속성을 추가할 수 있으며 사전 정의된 다양한 속성이 있습니다.위에서 언급한 편집기는 속성과 편집 방법을 설명하는 속성에 대한 사용자 정의 속성도 찾습니다.

전체적인 아이디어를 얻고 나면, 그것들 없이 어떻게 살았는지 궁금해 할 것입니다.

말했듯이 속성은 비교적 생성하기 쉽습니다.작업의 다른 부분은 이를 사용하는 코드를 만드는 것입니다.대부분의 경우 런타임 시 리플렉션을 사용하여 속성이나 해당 속성의 존재 여부에 따라 동작을 변경합니다.일종의 정적 분석을 수행하기 위해 컴파일된 코드의 특성을 검사하는 시나리오도 있습니다.예를 들어 매개변수는 null이 아닌 것으로 표시될 수 있으며 분석 도구는 이를 힌트로 사용할 수 있습니다.

속성을 사용하고 해당 사용에 적합한 시나리오를 아는 것이 작업의 대부분입니다.

속성은 본질적으로 귀하의 컴퓨터에 첨부하려는 데이터의 비트입니다. 종류 (클래스, 메소드, 이벤트, 열거형 등)

아이디어는 런타임에 다른 유형/프레임워크/도구가 쿼리한다는 것입니다. 당신의 속성에 정보를 입력하고 이에 따라 작업을 수행합니다.

예를 들어 Visual Studio는 타사 컨트롤의 특성을 쿼리하여 디자인 타임에 속성 창에 표시되어야 하는 컨트롤의 속성을 파악할 수 있습니다.

속성은 측면 지향 프로그래밍에서 객체를 장식하고 유효성 검사, 로깅 등을 추가하는 속성을 기반으로 런타임에 객체를 주입/조작하는 데 사용될 수도 있습니다.개체의 비즈니스 논리에 영향을 주지 않고 개체에 적용됩니다.

각 하위 클래스에 대해 동일한 코드를 반복해서 작성할 필요 없이 하위 클래스의 태그 값을 정의하는 간단한 방법으로 사용자 정의 속성을 사용할 수 있습니다.나는 좋은 것을 발견했다 John Waters의 간결한 예 자신의 코드에서 사용자 정의 속성을 정의하고 사용하는 방법에 대해 설명합니다.

에 튜토리얼이 있습니다. http://msdn.microsoft.com/en-us/library/aa288454(VS.71).aspx

속성 생성을 시작하려면 C# 소스 파일을 열고 다음을 입력하세요. attribute 그리고 [TAB]을 누르세요.새 속성에 대한 템플릿으로 확장됩니다.

속성은 측면 지향 프로그래밍에도 일반적으로 사용됩니다.이에 대한 예를 보려면 다음을 확인하세요. 포스트샤프 프로젝트.

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