ホームページ > バックエンド開発 > C++ > 「コレクションは固定サイズでした」という例外を発生させずに、C# でプロパティに属性を動的に割り当てるにはどうすればよいですか?

「コレクションは固定サイズでした」という例外を発生させずに、C# でプロパティに属性を動的に割り当てるにはどうすればよいですか?

Susan Sarandon
リリース: 2025-01-02 22:42:40
オリジナル
706 人が閲覧しました

How Can I Dynamically Assign Attributes to Properties in C# Without the

属性をプロパティに動的に割り当てる

実行時にプロパティに検証属性を割り当てようとすると、「コレクションは固定サイズ」の例外です。このエラーの原因は、プロパティ記述子の属性コレクションを直接変更できないことです。私たちの目的は、属性の割り当てを実現するための代替アプローチを検討することです。

提供されたコード スニペットは、FillAttributes メソッドを使用して属性を追加しようとしていますが、このメソッドは通常、内部使用を目的としており、すべてのユーザーからアクセスできるわけではありません。ケース。より信頼性の高いアプローチには、動的なアセンブリと型を作成し、新しく作成した型に属性を割り当てることが含まれます。

例を詳しく見てみましょう。

using System;
using System.Reflection;
using System.Reflection.Emit;

public class ValidationAttribute : Attribute
{
    public string ErrorMessage { get; set; }
}

public class Person
{
    public string Name { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        AssemblyName assemblyName = new AssemblyName("MyPersonAssembly");
        AssemblyBuilder assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave);
        ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("MyPersonModule");
        TypeBuilder typeBuilder = moduleBuilder.DefineType("MyPerson", TypeAttributes.Public);

        PropertyBuilder namePropertyBuilder = typeBuilder.DefineProperty("Name", PropertyAttributes.None, typeof(string), null);

        ConstructorInfo attributeConstructor = typeof(ValidationAttribute).GetConstructor(new[] { typeof(string) });
        CustomAttributeBuilder attributeBuilder = new CustomAttributeBuilder(attributeConstructor, new object[] { "Name is required" });

        namePropertyBuilder.SetCustomAttribute(attributeBuilder);

        Type newPersonType = typeBuilder.CreateType();
        Person person = (Person)Activator.CreateInstance(newPersonType);
    }
}
ログイン後にコピー

この例では、動的アセンブリ、モジュール、タイプ。次に、プロパティを作成し、それにカスタム検証属性を割り当てます。最後に、動的に作成された型のインスタンスを作成し、属性が正しく割り当てられていることを確認できます。

このアプローチを使用することで、「コレクションは固定サイズでした」という例外を回避し、属性をプロパティに動的に割り当てます。これにより、実行時のプロパティ変更の柔軟性が向上します。

以上が「コレクションは固定サイズでした」という例外を発生させずに、C# でプロパティに属性を動的に割り当てるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート