부분 클래스에서 속성을 정의한 다음 다른 부분 클래스의 속성으로 표시 할 수 있습니까?


83

다음과 같이 생성 된 코드 파일을 가질 수있는 방법이 있습니까?

public partial class A {
public string a {get; set;}
}

그리고 다른 파일에서 :

public partial class A {
[Attribute("etc")]
public string a {get; set;}
}

그래서 데이터베이스에서 생성 된 클래스를 가지고 생성되지 않은 파일을 사용하여 마크 업할 수 있습니까?


"데이터베이스에서 생성"되는 금액은 얼마입니까? 속성 정의 만 아니면 코드도?
snemarch

1
짧은 대답입니다. 긴 대답, stackoverflow.com/questions/456624/…의 중복 .
Kirk Woll

@snemarch : 속성 정의 만, 다른 코드를 직접 수행 할 계획입니다.
Chris McCall

1
부분 클래스 대신 인터페이스 + 구현 분할로 할 수 있습니까? 데이터베이스에서 인터페이스를 생성하고 구현에서 구현 (및 속성 추가)합니다.
snemarch

예이 가능하지만 메타 데이터를 사용하여 다음 다른 부분 상속이 메타 데이터
CyberNinja

답변:


33

나는 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; }
}

10
이 답변에는 언급이 있지만 OP가 제기 한 질문에 대한 일반적인 해결책은 아닙니다. 속성 소비자는 메타 데이터 클래스를 찾기 위해 여전히 알아야합니다. 즉, 이러한 속성은 Attribute.GetCustomAttribute (...)에 의해 반환 되지 않습니다 . (다행히도 많은 사용 사례에서 소비자는 MS에 의해 작성되었으며 특정 상황에서는 작동합니다.)
Kirk Woll

1
이 솔루션은 문제를 해결하지 않습니다. 다른 파일의 멤버를 장식하는 이유는 무엇입니까? 디자이너가 실행될 때마다 클래스가 덮어 쓰기되기 때문입니다. 따라서 귀하의 속성 [MetaDataType ...마다 디자이너 실행 삭제됩니다

2
@Desolator-아이디어는 MetadataType디자이너가 생성 한 파일에 속성을 넣지 않고 부분 클래스 Person가 정의 된 다른 파일에 넣는 것입니다 .
Dan Dumitru 2011

1
이 해결책의 문제는 부분적 된 클래스 shouldve 인
CyberNinja

85

그런 경우에 내가 사용해온 해결책은 다음과 같습니다. 속성으로 장식하려는 자동 생성 클래스가있을 때 유용합니다. 이것이 자동 생성 된 클래스라고 가정 해 보겠습니다.

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. 잘 했어!
Pflugs

의 생성자에 속성을 추가하려면 어떻게해야 UserProfile합니까?
Botis 2017 년

2
MetadataType.NET Core에 존재하지 않음
WoIIe 2019 년

2
.NET의 핵심 사용ModelMetadataType
YLJ

1
@ 데이브 지원은 3.0 .NET 핵심에 올 예정이다
로저 윌콕스

2

이것은 내 대답이
다른 클래스 파일이거나 동일한 파일에 메타 데이터를 결합하지만 네임 스페이스를 동일하게 유지하여 서로를 분명히 볼 수 있도록 할 수 있습니다.

더 많은 열을 추가하는 것과 같이 모델을 업데이트 할 때 프로젝트 클래스도 업데이트해야합니다.

--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
{
}

1

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; }
}

0

그렇지 않습니다. 컴파일러는 멤버가 여러 부분으로 정의되어 있다고 불평합니다. 그러나 사용자 정의 속성의 사용은 본질적으로 반영 적이므로 "메타 데이터"클래스를 정의하고이를 사용하여 데코레이터를 포함 할 수 있습니다.

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();

1
속성을 자신의 속성에 추가하는 배우가 속성을 소비하는 사람이기도하므로 마법의 "메타"클래스를 찾는 방법을 얼마나 자주 알게됩니까?
Kirk Woll

내 경험상 꽤 자주. 이것은 기존의 측면 지향 프레임 워크에서는 작동하지 않지만, 예를 들어 사용자 정의 유효성 검사 속성으로 도메인을 장식하는 경우 해당 속성을 찾고 위치를 정의 할 수 있습니다. 우리 팀은 우리 프로젝트 중 하나에서 정확히 이것을 수행했습니다. 가장 큰 단점은 다른 클래스를 찾지 않는다는 것입니다. 하나는 기능적이고 다른 하나는 장식적인 개발 중에 두 개의 병렬 클래스를 유지하고 있습니다. 처음에 부분 필드 / 속성을 정의 할 수 있다면 부분 클래스에서도 문제가 될 것입니다.
KeithS
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.