2017-11-22 3 views
1

MetadataType 특성 클래스를 사용하여 필드에 특성을 적용하려고합니다. 부분 클래스의 필드에 사용자 지정 특성을 적용 할 수 없었습니다. 내가 따라 왔던 몇 가지 예는 herehere입니다.C# 사용자 지정 특성이 적용되지 않습니다.

내 마지막 경기는 "해야 할 일"이 필요로하는 수업의 모든 필드를 표시하는 것입니다.

아래 예제에서 "Name"필드에 FooAttribute가 적용되기를 원합니다. 실생활에서 나는 생성 된 코드를 다루고있다. ...

내 매우 고된 예제에서, 나는 부분적인 클래스 - Cow, 생성 된 코드이다;

namespace Models 
{ 
    public partial class Cow 
    { 
     public string Name; 
     public string Colour; 
    } 
} 

내 FooAttribute를 사용하려면 이름 필드가 있어야합니다.

using System; 
using System.ComponentModel.DataAnnotations; 

namespace Models 
{ 
    public class FooAttribute : Attribute { } 

    public class CowMetaData 
    { 
     [Foo] 
     public string Name; 
    } 

    [MetadataType(typeof(CowMetaData))] 
    public partial class Cow 
    { 
     [Foo] 
     public int Weight; 

     public string NoAttributeHere; 
    } 

} 

이것은 FooAttribute 적용 가지고있는 무게 필드, 위대한 작품 -하지만이 부분 클래스에 있기 때문에 나는 것으로 기대합니다. 이름 필드는 메타 데이터에서 속성을 선택하지 않으며 이것이 실제로 필요한 것입니다.

내가 누락되었거나 잘못 되었습니까?

업데이트 : 이것은 FooAttribute가있는 필드를 검색하는 방법입니다.

public static void ShowAllFieldsWithFooAttribute(Cow cow) 
{ 
    var myFields = cow.GetType().GetFields().ToList(); 
    foreach (var f in myFields) 
    { 
     if (Attribute.IsDefined(f, typeof(FooAttribute))) 
     { 
      Console.WriteLine("{0}", f.Name); 
     } 
    } 
} 

이것의 결과는 다음과 같습니다
무게

하지만 기대 오전 :
이름
무게

답변

0

속성 메타 데이터의 일부이며 그들이 컴파일 된 결과에 영향을 미치는 것은 아니다. 클래스에 MetadataType 속성을 설정해도 모든 메타 데이터가 클래스의 속성/필드에 확산되지는 않습니다. ,

var fooFields = new Dictionary<FieldInfo, FooAttribute>(); 

    var cowType = typeof (Cow); 
    var metadataType = cowType.GetCustomAttribute<MetadataTypeAttribute>(); 
    var metaFields = metadataType?.MetadataClassType.GetFields() ?? new FieldInfo[0]; 

    foreach (var fieldInfo in cowType.GetFields()) 
    { 
     var metaField = metaFields.FirstOrDefault(f => f.Name == fieldInfo.Name); 
     var foo = metaField?.GetCustomAttribute<FooAttribute>() 
          ?? fieldInfo.GetCustomAttribute<FooAttribute>(); 
     if (foo != null) 
     { 
      fooFields[fieldInfo] = foo; 
     } 
    } 
+0

예 미안 : 그래서 당신은 (그것이 당신의 경우에서와 같이 함께 또는)

샘플을 확인하는 대신 초기 클래스의 속성을 코드에서 MetadataType 속성을 읽고 MetadataType에 정의 된 형식에서 메타 데이터를 사용할 필요가 , 나는 이해. 내 질문을 업데이트하여 속성을 찾는 방법을 보여줍니다. – Damo

+0

'Console.WriteLine (fieldInfo.Name);에'fooFields [fieldInfo] = foo;'를 변경 한 것과 거의 비슷합니다. 당신이 필요한 것을 얻을 수 있습니다. – ASpirin

+0

그래도 문제는 사용자 정의 속성입니다. 이름 필드에 적용되지 않습니다. 그런데이 줄의 MetadataClassType 때문에 예제를 컴파일 할 수 없습니다. var metaFields = metadataType? .MetadataClassType.GetFields() ?? 새로운 FieldInfo [0]; – Damo

관련 문제