次のようなコードファイルを生成する方法はありますか?
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;}
}
データベースからクラスを生成し、生成されていないファイルを使用してマークアップできるようにするには?
回答:
スコット・ガスリーの記事(終わり近く)でこのようなことが行われているのを見たことがありますが、自分で試したことはありません。
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のコアには存在しません
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();