다음과 같이 생성 된 코드 파일을 가질 수있는 방법이 있습니까?
public partial class A {
public string a {get; set;}
}
그리고 다른 파일에서 :
public partial class A {
[Attribute("etc")]
public string a {get; set;}
}
그래서 데이터베이스에서 생성 된 클래스를 가지고 생성되지 않은 파일을 사용하여 마크 업할 수 있습니까?
다음과 같이 생성 된 코드 파일을 가질 수있는 방법이 있습니까?
public partial class A {
public string a {get; set;}
}
그리고 다른 파일에서 :
public partial class A {
[Attribute("etc")]
public string a {get; set;}
}
그래서 데이터베이스에서 생성 된 클래스를 가지고 생성되지 않은 파일을 사용하여 마크 업할 수 있습니까?
답변:
나는 Scott Guthrie의 기사에서 이와 같은 일을 봤습니다 (끝 부분에 있음).하지만 직접 시도하지는 않았습니다.
http://weblogs.asp.net/scottgu/archive/2010/01/15/asp-net-mvc-2-model-validation.aspx
[MetadataType(typeof(Person_Validation))]
public partial class Person
{
// Partial class compiled with code produced by VS designer
}
[Bind(Exclude="ID")]
public class Person_Validation
{
[Required(ErrorMessage = "First Name Required")]
[StringLength(50, ErrorMessage = "Must be under 50 characters")]
public string FirstName { get; set; }
[Required(ErrorMessage = "Last Name Required")]
[StringLength(50, ErrorMessage = "Must be under 50 characters")]
public string LastName { get; set; }
[Required(ErrorMessage = "Age Required")]
[Range(0, 120, ErrorMessage = "Age must be between 0 and 120")]
public int Age { get; set; }
[Required(ErrorMessage = "Email Required")]
[Email(ErrorMessage = "Not a valid email")]
public string Email { get; set; }
}
[MetaDataType ...
마다 디자이너 실행 삭제됩니다
MetadataType
디자이너가 생성 한 파일에 속성을 넣지 않고 부분 클래스 Person
가 정의 된 다른 파일에 넣는 것입니다 .
그런 경우에 내가 사용해온 해결책은 다음과 같습니다. 속성으로 장식하려는 자동 생성 클래스가있을 때 유용합니다. 이것이 자동 생성 된 클래스라고 가정 해 보겠습니다.
public partial class UserProfile
{
public int UserId { get; set; }
public string UserName { get; set; }
public string Firstname { get; set; }
public string Lastname { get; set; }
}
그리고 UserId가 키임을 지정하는 속성을 추가하고 싶습니다. 그런 다음 다음과 같은 다른 파일에 부분 클래스를 만듭니다.
[Table("UserProfile")]
[MetadataType(typeof(UserProfileMetadata))]
public partial class UserProfile
{
internal sealed class UserProfileMetadata
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int UserId { get; set; }
}
}
MetadataType
. 잘 했어!
UserProfile
합니까?
MetadataType
.NET Core에 존재하지 않음
ModelMetadataType
이것은 내 대답이
다른 클래스 파일이거나 동일한 파일에 메타 데이터를 결합하지만 네임 스페이스를 동일하게 유지하여 서로를 분명히 볼 수 있도록 할 수 있습니다.
더 많은 열을 추가하는 것과 같이 모델을 업데이트 할 때 프로젝트 클래스도 업데이트해야합니다.
--your model class
public partial class A {
public string a {get; set;}
}
--your project class
public class Ametadata {
[Attribute("etc")]
public string a {get; set;}
}
[MetadataType(typeof(Ametadata))]
public partial class A
{
}
A
아래 예제와 같이 클래스에 대한 부분 클래스를 정의해야합니다.
using System.ComponentModel.DataAnnotations;
// your auto-generated partial class
public partial class A
{
public string MyProp { get; set; }
}
[MetadataType(typeof(AMetaData))]
public partial class A
{
}
public class AMetaData
{
[System.ComponentModel.DefaultValue(0)]
public string MyProp { get; set; }
}
그렇지 않습니다. 컴파일러는 멤버가 여러 부분으로 정의되어 있다고 불평합니다. 그러나 사용자 정의 속성의 사용은 본질적으로 반영 적이므로 "메타 데이터"클래스를 정의하고이를 사용하여 데코레이터를 포함 할 수 있습니다.
public class A
{
public string MyString;
}
public class AMeta
{
[TheAttribute("etc")]
public object MyString;
}
...
var myA = new A();
var metaType = Type.GetType(myA.GetType().Name + "Meta");
var attributesOfMyString = metaType.GetMember("MyString").GetCustomAttributes();