2012-03-20 17 views
14

hereで説明したように、C#では汎用属性の宣言はサポートされていません。C#汎用属性の制限の回避策

User fuuObj = (User) repository.LoadById<T>(_id); 
:私は、一般的なリポジトリからメソッドを呼び出す必要が原因、私の属性のimplクラスの魅力のように収まるように

[Audit<User> (UserAction.Update)] 
public ActionResult SomeMethod(int id){ ... 

: だから、私のような何かをすることはできませんよ

私はthisソリューションを使用しようとしましたが、成功しませんでした。私はtypeOf(User)のようなものを渡すことができますが、LoadByIdとタイプまたはマジックストリングをどうやって呼び出すことができますか?

* TとUserの両方が、Entityという基本クラスを拡張しています。

+1

はあなたがタイプごとに異なる属性を書くことができますか? –

+0

特定のクラスが必要ですか、またはEntityで十分ですか? – Bas

+0

@ダニエル、はい...しかし、私は実際にすべての聴覚プロセスを中心にして、この文脈で可能な限り将来のコードを最大限に避けています。 – Custodio

答えて

16

あなたがidでロードするためにリフレクションを使用することができます。

public class AuditAttribute : Attribute 
{ 
    public AuditAttribute(Type t) 
    { 
     this.Type = t; 
    } 

    public Type Type { get; set; } 

    public void DoSomething() 
    { 
     //type is not Entity 
     if (!typeof(Entity).IsAssignableFrom(Type)) 
      throw new Exception(); 

     int _id; 

     IRepository myRepository = new Repository(); 
     MethodInfo loadByIdMethod = myRepository.GetType().GetMethod("LoadById"); 
     MethodInfo methodWithTypeArgument = loadByIdMethod.MakeGenericMethod(this.Type); 
     Entity myEntity = (Entity)methodWithTypeArgument.Invoke(myRepository, new object[] { _id }); 
    } 
} 
4

あなたは、少なくともこれらの三つの可能性があります:あなたは、あなたがそのあなたのリポジトリにLoadById方法を提供することができLoadById

  • を呼び出す式ツリーを作成することができLoadById
  • を呼び出すためにリフレクションを使用することができ

    1. を一般的ではありません。
  • 関連する問題