これが現在どのように機能するかのサンプルです:
[MetadataType(typeof(PersonMetadata))]
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
public class PersonMetadata
{
[Required]
public string Name { get; set; }
[Range(0,150]
public int Age { get; set; }
}
ただし、MetadataAttribute を Person クラスに配置する必要はありません。代わりに、MVC フレームワークに「Person クラスに遭遇した場合、メタデータは PersonMetadata クラスにあります」と伝える何らかの方法が必要です。
メタデータで「拡張」するために Person クラスに触れる必要がないため、私にとってより構成的であると感じる方向を逆にし、Open-Close Principle に従っているだけです。
これにより、複数の競合するメタデータが添付される可能性があり、複雑さが増しますが、柔軟性には常に代償が伴います。
プログラムによる方法または宣言的な方法、またはできれば両方が必要です:)
したがって、次のようなものになる可能性があります。
MetadataTypeMappings.Add(typeof(Person), typeof(PersonMetadata));
別の可能性があります:
[MetadataFor(typeof(Person)]
public class PersonMetadata
{
[Required]
public string Name { get; set; }
[Range(0,150]
public int Age { get; set; }
}