2017-02-17 1 views
0

Google에 어떤 구문을 사용할지 모르겠습니다.[MyAttribute (Name = value)]의 "Name = value"란 무엇입니까

[MyAttribute(MyOption=true,OtherOption=false)] 

Name=value 부분은 무엇인가

이 속성을 고려

? 그리고 어떻게 내 자신의 사용자 지정 특성에 그것을 구현할 수 있습니까? 하지만 () 대신 {}와,

[AttributeUsage(AttributeTargets.All)] 
public class MyAttribute : Attribute 
{ 
    public string TestValue { get; set; } 
} 

[My(TestValue = "Hello World!")] 
public class MyClass{} 

그래서 거의 개체 초기화 구문처럼 작동 :

+0

표시 (이름 = "값")? – Hemal

답변

5

당신은 공공 예 (비 정적) 속성 또는 필드를 선언하여 사용할 수 있습니다. 당신이 당신의 속성에 대한 매개 변수로 생성자를 제공하는 경우


먼저 매개 변수를 전달해야 :

[AttributeUsage(AttributeTargets.All)] 
public class MyAttribute : Attribute 
{ 
    public string TestValue { get; set; } 

    public MyAttribute(int arg) 
    {} 
} 

[My(42, TestValue = "Hello World!")] 
public class MyClass{} 

자세한 내용은 this tutorial를 참조하십시오.

+0

어떻게하면 [[MyAttribute ("foo", TestValue = " Hello World! "]? – Ross

+0

@ 로스가 내 대답을 업데이트했습니다. –

+0

매우 명확한 감사 – Ross

3

C#을 사양 17.2 Attribute specification :

속성은 속성 이름과 위치명명 된 인수의 선택 목록으로 구성됩니다. 위치 지정 인수 (있는 경우) 이 이름 지정된 인수 앞에옵니다. 위치 지정 인수는 attribute-argument-expression으로 구성됩니다. 명명 된 인수는 이라는 이름과 등호 다음에 attribute-argument-expression으로 구성되며, 이는 간단한 할당과 동일한 규칙 인 에 의해 제한됩니다. 명명 된 인수의 순서는 이 아닙니다. 그래서 여기

[MyAttribute(MyOption=true,OtherOption=false)] 

라는 이름의 인수를. 명명 된 인수는 무엇입니까? 또, C#을 사양 17.3.1 Compilation of an attribute :

이름 T (속성 유형)에 비 정적 읽기 쓰기 공공 필드 또는 속성을 식별해야합니다. T가 그러한 필드 또는 특성을 갖지 않으면 컴파일 시간 오류 이 발생합니다.

매우 분명합니다. 당신이 더 많은 명명 된 인수가 필요한 경우

public class MyAttribute : Attribute 
{ 
    public bool MyOption { get; set; } 
    public bool OtherOption { get; set; } 
} 

- 다른 비 정적 공개 읽기 - 쓰기를 추가 getter 및 setter 또는 비 정적 public 필드와 그 이름 중 비 정적 공용 속성 (대부분은) MyAttribute 클래스에 선언 속성 또는 비 정적 공용 필드에 사용할 이름을 지정하십시오.

public class MyAttribute : Attribute 
{ 
    public bool MyOption { get; set; } 
    public bool OtherOption { get; set; } 
    public int Answer { get; set; } 
    // public int Answer; <- another option 
} 

사용 (중요하지 않습니다 순서) : 속성의 인스턴스를 생성 할 때

[MyAttribute(MyOption=true, Answer=42, OtherOption=false)] 
2

그것은 속성을 지정합니다.

속성은 생성자 매개 변수와 속성을 가질 수 있습니다.이 속성은 속성을 설정합니다. 아래 예제에서와 같이, 위치 생성자 인자라는 생성자 인수 및 속성을 혼합 할 수 있습니다 :

using System; 
using System.Linq; 
using System.Reflection; 

[AttributeUsage(AttributeTargets.All)] 
public class DemoAttribute : Attribute 
{ 
    public string Property { get; set; } 
    public string Ctor1 { get; set; } 
    public string Ctor2 { get; set; } 
    public string Ctor3 { get; set; } 

    public DemoAttribute(string ctor1, 
         string ctor2 = "default2", 
         string ctor3 = "default3") 
    { 
     Ctor1 = ctor1; 
     Ctor2 = ctor2; 
     Ctor3 = ctor3; 
    } 
} 

[Demo("x", ctor3: "y", Property = "z")] 
public class Test 
{ 
    static void Main() 
    { 
     var attr = (DemoAttribute) typeof(Test).GetCustomAttributes(typeof(DemoAttribute)).First(); 
     Console.WriteLine($"Property: {attr.Property}"); 
     Console.WriteLine($"Ctor1: {attr.Ctor1}"); 
     Console.WriteLine($"Ctor2: {attr.Ctor2}"); 
     Console.WriteLine($"Ctor3: {attr.Ctor3}"); 
    } 
} 

주에게 속성이 할당에 대한 명명 된 생성자 인수 :의 차이, 그리고 =을.

이 코드의 출력은

Property: z 
Ctor1: x 
Ctor2: default2 
Ctor3: y 

는 C# 사양이 경우 :(

관련 문제