0

私はこのインターフェースを持っています:

public interface IRepository<T>
{
    List<T> List();
    T Get(int Id);        
    bool Add(T entity);
    bool Update(T entity);
}

そして、私はこのクラスを持っています:

public class Customer<T> : IRepository<Entities.Customer>
{
   public Entities.Customer Get(int Id)
   {
      var c = new Entities.Customer();
      return c;
   }

   //continue...
}

次のように、ジェネリック クラスをジェネリック インターフェイスにキャストするにはどうすればよいですか。

//Other method
public IRepositorio<T> DoStuff<T>(int Id)
{  
   var a = (IRepository<Entities.Customer>)Activator.CreateInstance(typeof(T)); // ok               
   var b = (IRepository<T>)Activator.CreateInstance(typeof(T)); // Exception: unable to cast       

   return object; // an object
}

そして、この MCV コントローラーから呼び出します。

  public ActionResult Home()
  {
     var repo = new Repository();
     repo.DoStuff<Customer<Entities.Custormer>>(10);

     return View();
  }

私の構想は大丈夫ですか?これは動的なしで可能ですか?

4

2 に答える 2

1

提供されたコードに基づいて、次のことを試してみましたが、問題なくコンパイルできました

public class Entities {
    public class Customer {
    }
}

public interface IRepository<T> {
    T Get(int Id);
}

public class Customer<T> : IRepository<Entities.Customer> {
    public Entities.Customer Get(int Id) {
        var cliente = new Entities.Customer();
        return cliente;
    }
}

public class foo {

    public static IRepository<T> DoStuff<T>(int Id) {
        var a = (IRepository<Entities.Customer>)Activator.CreateInstance(typeof(T));
        var b = (IRepository<T>)Activator.CreateInstance(typeof(T));

        return b; // an object
    }

}

ただし、Tが何を意味するのかわかりません。走って電話したら

foo.DoStuff<Entities.Customer>(0);

var aクラスEntities.Customerがインターフェイスを実装していないため、実行時エラーが発生しますIRepository<T>。私が電話したら

foo.DoStuff<Customer<Entities.Customer>>(0);

Customer<Entities.Customer>クラスが実装されIRepository<Entities.Customer>ていないため、「var b」行で実行時エラーが発生しますIRepository<Customer<Entities.Customer>>

どちらの例外も正しいので、質問の作成者がこの回答から問題がどこにあるのかを理解できることを願っています。

于 2013-04-11T18:54:16.813 に答える
1

Activator.CreateInstance(typeof(T));T-これは、あなたの例にあるの新しいインスタンスを作成しますがEntities.Customer、 のインスタンスを作成したいようですCustomer<Entities.Customer>

于 2013-04-11T19:22:01.650 に答える