ホームページ >バックエンド開発 >C++ >C# で検証属性をプロパティに動的に追加するにはどうすればよいですか?

C# で検証属性をプロパティに動的に追加するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-03 09:40:40456ブラウズ

How Can I Dynamically Add Validation Attributes to Properties in C#?

属性をプロパティに動的に追加する

このコード サンプルは、実行時に検証属性をプロパティに追加する方法を示します。これは、リフレクションを利用してプロパティの FillAttributes メソッドにアクセスし、必要な属性を注入します。

コード分析

// Get PropertyDescriptor object for the given property name
var propDesc = TypeDescriptor.GetProperties(typeof(T))[propName];

// Get FillAttributes methodinfo delegate
var methodInfo = propDesc.GetType().GetMethods(BindingFlags.Instance | BindingFlags.Public |
                                                      BindingFlags.NonPublic)
    .FirstOrDefault(m => m.IsFamily || m.IsPublic && m.Name == "FillAttributes");

// Create Validation attribute
var attribute = new RequiredAttribute();
var attributes = new ValidationAttribute[] { attribute };

// Invoke FillAttribute method
methodInfo.Invoke(propDesc, new object[] { attributes });

例外分析

ただし、実行時に、「コレクションは固定サイズでした」という例外がありました。これは、プロパティの検証属性コレクションが固定サイズの配列として定義されているために発生します。これに対処するには、既存の配列をより大きな新しい配列に置き換える必要があります。

解決策

この問題を解決するには、カスタム属性キャッシュ システムを実装して属性を動的に保存および適用できます。 。実装例は次のとおりです。

// Initialize cache dictionary and synchronization mechanism
private static readonly Dictionary<Type, Attribute[]> AttributeCache = new Dictionary<Type, Attribute[]>();
private static readonly object SyncObject = new object();

protected override Attribute[] GetCustomAttributes(Type attributeType, bool inherit)
{
    if (AttributeCache.TryGetValue(this.GetType(), out Attribute[] cachedAttrs))
    {
        return cachedAttrs;
    }
    else
    {
        lock (SyncObject)
        {
            if (!AttributeCache.TryGetValue(this.GetType(), out cachedAttrs))
            {
                cachedAttrs = base.GetCustomAttributes(attributeType, inherit);
                AttributeCache.Add(this.GetType(), cachedAttrs);
            }
        }
        return cachedAttrs;
    }
}

このカスタム キャッシュ メカニズムを使用すると、コードは固定サイズのコレクション例外を発生させることなく、実行時にプロパティに検証属性を正常に追加します。

以上がC# で検証属性をプロパティに動的に追加するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。