none
求助~标题不知道说什么好~还是看内容吧 RRS feed

  • 问题

  • 比如有3个类(A、B、C)

    它们分别有一返回集合的方法
    List<A> Get();
    List<B> Get();
    List<C> Get();

    现在有一个公共方法
    T GetAll<T>();

    请问这个方法我该怎么写能分别返回不同的对象集合

     


    付出不一定有回报,不付出那就一定没有回报!
    2010年5月25日 8:47

答案

  • 不知道你获取 A B C 分别是如何实现的,

    你可以判断 T 的 Type,  if(typeof(T) == typeof(A)) { ....


    问题要简单,错误须详细@错误/异常/堆栈信息+操作系统+软件版本+all the context of the issue Hope Helpful | http://www.leoworks.net
    2010年5月25日 9:24
  • 你可以定义一个接口

     

    让3个类都继承于这个接口

    并把GetAll方法提升到接口里面去定义

    在new的时候 左边是接口 右边是它的子类 调用GetAll方法 就是对应new不同对象的方法

    interface mainlist{ 
    public Object[] GetAll(mainlist ClassType); 
    } 
    class A : mainlist 
    { 
    public Object[] GetAll() 
    { 
    //自己实现 return new object[] { };
     } 
    }
    比如 MainList lista=new A(){};
    lista.GetAll(); //调用在A类实现的方法

     

     

    比如 mainlist lista=new A(){}; lista.GetAll(); //调用在A类实现的方法
    2010年5月26日 1:38
  • 如果 A、B、C 有继承关系,假设 A > B > C,就可以这样做。

    1、把 A、B、C 中的 Get 签名改成:

    // A
    public virtual IList<A> Get();
    // B
    public virtual IList<B> Get();
    // C
    public virtual IList<C> Get();

    把签名改一下:

    IList<T> GetAll<T>() where T : A, new()

    函数这样写。

    return new T().Get();

    就可以了。这个方法在 .NET Framework 4.0 上可以编译通过。因为这里需要一个 IList<T> 上的协变 (covariance)。4.0 中的 IList<out T> 具备协变特性。

    如果 A、B、C 没有继承关系并且您在使用 .NET Framework 3.5,就按楼上所说,实现一接口:

    public interface IFoo
    {
        IList Get();
    }

    public class A : IFoo { ... }

    public List<T> GetAll<T>() where T : IFoo, new()
    {
        return new T().Get().OfType<T>();
    }


    Mark Zhou
    2010年5月26日 9:26

全部回复

  • 不知道你获取 A B C 分别是如何实现的,

    你可以判断 T 的 Type,  if(typeof(T) == typeof(A)) { ....


    问题要简单,错误须详细@错误/异常/堆栈信息+操作系统+软件版本+all the context of the issue Hope Helpful | http://www.leoworks.net
    2010年5月25日 9:24
  • <form id="aspnetForm" action="edit" enctype="application/x-www-form-urlencoded" method="post">
    <input id="__EVENTTARGET" name="__EVENTTARGET" type="hidden" /> <input id="__EVENTARGUMENT" name="__EVENTARGUMENT" type="hidden" /> <input id="__VIEWSTATE" name="__VIEWSTATE" type="hidden" value="/wEPDwULLTEzNzk0MzkwMDlkZEMpty7R2lukRYyoGDAFiw9m2frw" />
    <script type="text/javascript"></script> <script type="text/javascript"></script> <script type="text/javascript"></script> </form>
     
     
    Microsoft
     
     
     
     
     
     
    <form action="/Forums/zh-CN/visualcshartzhchs/thread/8b5a8881-0f03-45c8-bc17-2e1691d2b785/406647b6-8990-4c50-9f93-6191797785ab/edit" enctype="application/x-www-form-urlencoded" method="post">

    编辑消息

    <textarea cols="100" rows="20" name="body"><p>你可以定义一个接口</p> <p>让3个类都继承于这个接口</p> <p>并把GetAll方法提升到接口里面去定义</p> <p>在new的时候 左边是接口 右边是它的子类 调用GetAll方法 就是对应new不同对象的方法</p> <pre lang="x-c#">interface mainlist{ public Object[] GetAll(mainlist ClassType); } class A : mainlist { public Object[] GetAll() { //自己实现 return new object[] { }; } }</pre> <pre lang="x-c#">比如 MainList lista=new A(){};</pre> <pre lang="x-c#">lista.GetAll(); //调用在A类实现的方法</pre> <p>&nbsp;</p> <p>&nbsp;</p> 比如 mainlist lista=new A(){}; lista.GetAll(); //调用在A类实现的方法 </textarea>
    <label for="hasCode">Resource.HasCodeLabel</label><input checked="checked" name="hasCode" type="checkbox" value="true" /> <label for="reason">原因</label><input name="reason" type="text" />
    <input title="提交" type="submit" value="提交" />
    </form>
    <script type="text/javascript"></script> <script type="text/javascript"></script> <script type="text/javascript"></script> <noscript></noscript> <script type="text/javascript"></script> <noscript></noscript> <noscript></noscript>
    2010年5月26日 1:34
  • 你可以定义一个接口

     

    让3个类都继承于这个接口

    并把GetAll方法提升到接口里面去定义

    在new的时候 左边是接口 右边是它的子类 调用GetAll方法 就是对应new不同对象的方法

    interface mainlist{ 
    public Object[] GetAll(mainlist ClassType); 
    } 
    class A : mainlist 
    { 
    public Object[] GetAll() 
    { 
    //自己实现 return new object[] { };
     } 
    }
    比如 MainList lista=new A(){};
    lista.GetAll(); //调用在A类实现的方法

     

     

    比如 mainlist lista=new A(){}; lista.GetAll(); //调用在A类实现的方法
    2010年5月26日 1:38
  • 如果 A、B、C 有继承关系,假设 A > B > C,就可以这样做。

    1、把 A、B、C 中的 Get 签名改成:

    // A
    public virtual IList<A> Get();
    // B
    public virtual IList<B> Get();
    // C
    public virtual IList<C> Get();

    把签名改一下:

    IList<T> GetAll<T>() where T : A, new()

    函数这样写。

    return new T().Get();

    就可以了。这个方法在 .NET Framework 4.0 上可以编译通过。因为这里需要一个 IList<T> 上的协变 (covariance)。4.0 中的 IList<out T> 具备协变特性。

    如果 A、B、C 没有继承关系并且您在使用 .NET Framework 3.5,就按楼上所说,实现一接口:

    public interface IFoo
    {
        IList Get();
    }

    public class A : IFoo { ... }

    public List<T> GetAll<T>() where T : IFoo, new()
    {
        return new T().Get().OfType<T>();
    }


    Mark Zhou
    2010年5月26日 9:26