MetadataType 특성 클래스를 사용하여 필드에 특성을 적용하려고합니다. 부분 클래스의 필드에 사용자 지정 특성을 적용 할 수 없었습니다. 내가 따라 왔던 몇 가지 예는 here과 here입니다.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);
}
}
}
이것의 결과는 다음과 같습니다
무게
하지만 기대 오전 :
이름
무게
예 미안 : 그래서 당신은 (그것이 당신의 경우에서와 같이 함께 또는)
샘플을 확인하는 대신 초기 클래스의 속성을 코드에서
MetadataType
속성을 읽고MetadataType
에 정의 된 형식에서 메타 데이터를 사용할 필요가 , 나는 이해. 내 질문을 업데이트하여 속성을 찾는 방법을 보여줍니다. – Damo'Console.WriteLine (fieldInfo.Name);에'fooFields [fieldInfo] = foo;'를 변경 한 것과 거의 비슷합니다. 당신이 필요한 것을 얻을 수 있습니다. – ASpirin
그래도 문제는 사용자 정의 속성입니다. 이름 필드에 적용되지 않습니다. 그런데이 줄의 MetadataClassType 때문에 예제를 컴파일 할 수 없습니다. var metaFields = metadataType? .MetadataClassType.GetFields() ?? 새로운 FieldInfo [0]; – Damo