7

いくつかの属性マークアップを使用するフレームワークに取り組んでいます。これは MVC プロジェクトで使用され、ビュー (例: /Details/5) で特定のレコードを表示するたびに発生します。

これを行うためのより良い/より効率的な方法や、優れたベストプラクティスの例があるかどうか疑問に思っていました.

とにかく、私はいくつかの属性を持っています。

[Foo("someValueHere")]
String Name {get;set;}

[Bar("SomeOtherValue"]
String Address {get;set;}

これらの属性を探すための最も効率的な方法/ベストプラクティスは何ですか/それらの値に基づいて行動しますか?

私は現在、次のようなことをしています:

[System.AttributeUsage(AttributeTargets.Property)]
class FooAttribute : Attribute
{

    public string Target { get; set; }

    public FooAttribute(string target)
    {
        Target = target;
    }
}

そして、これらの属性に作用する私の方法では(単純化された例!):

public static void DoSomething(object source)
{
    //is it faster if I make this a generic function and get the tpe from T?
    Type sourceType = source.GetType();

    //get all of the properties marked up with a foo attribute
    var fooProperties =  sourceType
      .GetProperties()
      .Where(p => p.GetCustomAttributes(typeof(FooAttribute), true)
      .Any())
      .ToList();

    //go through each fooproperty and try to get the value set
    foreach (var prop in fooProperties)
    {          
        object value = prop.GetValue(source, null);
        // do something with the value
        prop.SetValue(source, my-modified-value, null);
     }
 }
4

2 に答える 2

2

Attribute.GetCustomAttributePropertyInfo/は、MemberInfo.GetCustomAttribute属性オブジェクトを取得するための推奨される方法です。

ただし、通常、すべてのプロパティを属性で列挙するわけではありません。通常、特定の属性を操作したいので、GetCustomAttribute直接呼び出すだけです。プロパティの属性を探している場合は、GetCustomAttribute() に基づいて属性を探しているプロパティを列挙するのが最善の方法です。

于 2012-09-05T03:56:15.243 に答える
1

属性を扱う場合、実際には多くの選択肢はありません。コードはそのままで問題ありません。また、パフォーマンス上の主な懸念事項になる可能性も低いです。差し迫った唯一のことは、ToList通話を完全に不要なものとしてドロップすることです。


補足: パフォーマンス関連の質問は、おおよそのように見える必要があります

「コードを測定したところ、XXX の部分に時間がかかりすぎているようです (YYY)。コードのこの部分の目標時間は ZZZ です。XXX を実行する私の方法は合理的ですか / どこを改善できますか?」.

あなたのケースでは YYY と ZZZ の時間部分が欠けていることに注意してください。そのため、あなたのケースで遅いかどうかは本当にわかりません。また、コード全体の速度が向上する可能性が高いため、DB/その他の IO バウンド操作で測定を開始することをお勧めします。

この属性関連のコードが主なパフォーマンスの問題であると判断した後、何らかの結果のキャッシュまたは何らかのコード生成を検討できます (必要な値を設定するラムダをキャッシュするか、本格的な IL 生成を行うこともできます)。

于 2012-09-05T04:38:19.337 に答える