私はこのような複数のプロパティを持つオブジェクトを持っています:
public int num1 { get; set; }
public int num2 { get; set; }
public string str1 { get; set; }
public string str2 { get; set; }
これらのプロパティは動的に生成されるクラス内にあるため、プロパティ上のすべてのCustomAttributesが消去されます。
追加してみました
[Submit]
MyClass myObject
しかし、それは私のオブジェクトのプロパティには広がりませんでした
C#内で動的にそれを行う方法はありますか?
あなたの質問を理解するのに少し苦労していますが、明確にしようと思います。
複数の属性を持つオブジェクトがあります...すべてのCustomAttributesが消去されます
C#の用語では、この形式のクラスメンバーは、<access> <type> <name> { get; set; }
「属性」ではなく「プロパティ」と呼ばれます。一方、「属性」は、参照しているカスタム属性など、アノテーションのC#実装です。
とはいえ、現在、複数のプロパティを持つ自動生成されたクラスがあることを意味していると理解しています。これらの各プロパティに独自のカスタム属性を持たせたいのですが、クラスを編集すると、次に生成されるときに削除され、クラスジェネレータにカスタム属性を含めることはできません。
クラスのコンテキストをもっと知ることが役立つかもしれません。たとえば、どのように生成されますか?それがEntityFrameworkクラスである場合、次のSO質問はいくつかの洞察を提供する可能性があります。エンティティフレームワークによって生成されたクラスにデータ注釈を追加します。一般に、生成されたクラスは(または作成できますか)partial
ですか?もしそうなら、あなたはまだ上記の質問の答えのアプローチに従うことができます、すなわち。プロパティのカスタム属性を提供する独自の部分クラス実装を作成します。
たとえば、生成されたクラスが次のように見える(または見えるようにすることができる)場合:
/// <auto-generated />
public partial class MyClass
{
public int Num1 { get; set; }
public int Num2 { get; set; }
public string Str1 { get; set; }
public string Str2 { get; set; }
}
次のように、カスタムアノテーションを使用して部分クラスの他の部分を記述できます。
/// human generated
public partial class MyClass
{
[Submit]
public int Num1 { get; set; }
[Submit]
public int Num2 { get; set; }
[Submit]
public string Str1 { get; set; }
[Submit]
public string Str2 { get; set; }
}
繰り返しになりますが、あなたの状況について詳しく知ることなく、これがあなたに必要な情報を提供するかどうかはわかりませんが、少なくともあなたに出発点を与えることを願っています。
編集
クラスが部分的でない場合は、生成されたクラスを、ラッピングプロパティがカスタム属性を使用するクラスでラッピングすることを検討してください。例えば、
/// human generated
public class MyClassWrapper
{
private readonly MyClass wrapped;
public MyClassWrapper(MyClass wrapped)
{
this.wrapped = wrapped;
}
[Submit]
public int Num1 { get => this.wrapped.Num1; set => this.wrapped.Num1 = value; }
[Submit]
public int Num2 { get => this.wrapped.Num2; set => this.wrapped.Num2 = value; }
[Submit]
public string Str1 { get => this.wrapped.Str1; set => this.wrapped.Str1 = value; }
[Submit]
public string Str2 { get => this.wrapped.Str2; set => this.wrapped.Str2 = value; }
}
編集2
設計と実行時の複雑さを犠牲にして、より動的なソリューションが必要な場合は、次のSOの質問を検討してください。実行時にTypeDescriptorにプロパティレベルの属性を追加するにはどうすればよいですか。。同様の懸念に対処しているようです-
実際、コードを生成するのはMSのアプリケーション設定用であるため、プロパティごとに拡張することはできません。
ここではGmanの説明を完全に複製することはしませんが、基本的にこのアプローチは
MyClass
)またはタイプのインスタンスを取得しますmyObject
TypeDescriptor.GetProvider(MyClass
/ myObject).GetTypeDescriptor(MyClass
/myObject)
タイプまたはオブジェクトのベースラインを取得しますICustomTypeDescriptor
PropertyOverridingTypeDescriptor
このベースライン記述子を使用して彼を構築しますMyClass
/myObject
のプロパティの定義をTypeDescriptor.GetProperties(MyClass
/で繰り返しmyObject)
ます。使用TypeDescriptor.CreateProperty
カスタム属性を追加し、現在のプロパティの定義に基づいて新しいプロパティ定義、作成するEditorAttribute
(または、あなたのケースでSubmitAttribute
)を、および使用PropertyOverridingTypeDescriptor
新しいプロパティ定義を使用するために3で構築します。TypeDescriptorOverridingProvider
をPropertyOverridingTypeDescriptor
構築します。MyClass
/myObject
しTypeDescriptor.AddProvider
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加