泛型参数转换为原型

Anod 2013-09-18 02:58:54
举例

public Class A
{
public void SetData<T>(object obj)
{
//传入的obj类型由T来定
//若obj类型是B
//求如何调用obj的GetData()方法?
//强转,as 都不行,难道在B中还要自己实现一个object 到B的转换方法?


}
}

public Class B
{
public string GetData()
{
return "123";
}
...
}
...全文
147 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Anod 2013-09-18
  • 打赏
  • 举报
回复
别批评啦, 只是使用一个派生类对象实例化的基类类型参数,要取派生类中的数据时赶脚可能用泛型,派生类中的数据各不相同,才使得我这里要区分类型.
cheng2005 2013-09-18
  • 打赏
  • 举报
回复
泛型是什么都没弄明白就想着套用。 邯郸学步 你说说你的需求和泛型也什么关系吗?随便搜一下,找找泛型的概念,用法,好处,然后再回头考虑你的问题。
Anod 2013-09-18
  • 打赏
  • 举报
回复
引用 7 楼 qldsrx 的回复:
只要如此即可:
public class A
{
    public void SetData<T>(T obj) where T:IGetData
    {
       string data = obj.GetData();
    }
}

public class B : IGetData
{
     public string GetData()
    {
         return "123";
     }
...
}

public interface IGetData
{
     string GetData();
}
用了泛型就别再用弱类型object了,全部强类型到底,不用接口限制就没意义了。
哦 看来如果没有同样的接口,用泛型没什么意义了.只能这样用了吧?:
if(obj.GetType() == typeof(B))
       {
            string data = ((B)obj).GetData();//目的是这样的,我想拿到这样的数据
       }
       else if(obj.GetType() == typeof(string))
       {
            string data = (string)obj;
       }
Anod 2013-09-18
  • 打赏
  • 举报
回复

public Class A
{
    public void SetData<T>(object obj)
    {
       //传入的obj类型由T来定
       //若obj类型是B
       //求如何调用obj的GetData()方法?
       //强转,as 都不行,难道在B中还要自己实现一个object 到B的转换方法?
       if(typeof(T) == typeof(B))
       {
            string data = ((B)obj).GetData();//目的是这样的,我想拿到这样的数据
       }
       else if(typeof(T) == typeof(string))
       {
            string data = (string)obj;
       }
     }
}
   
public Class B
{
     public string GetData()
    {
         return "123";
     }
...
}

public Class C
{
    public C()
   {
      A mData = new A();

      //那也就是说这样用时行不通的了?
      A.SetData<B>(new B);
      A.SetData<string>("name");
   }
}


引用 6 楼 wanghui0380 的回复:
public void SetData<T>(T obj) where T:IXXX 带有这方法的接口 这样做才有意义。否则没有任何意义。也就是反射, dynamic这种临时性的玩意
qldsrx 2013-09-18
  • 打赏
  • 举报
回复
只要如此即可:
public class A
{
    public void SetData<T>(T obj) where T:IGetData
    {
       string data = obj.GetData();
    }
}

public class B : IGetData
{
     public string GetData()
    {
         return "123";
     }
...
}

public interface IGetData
{
     string GetData();
}
用了泛型就别再用弱类型object了,全部强类型到底,不用接口限制就没意义了。
wanghui0380 2013-09-18
  • 打赏
  • 举报
回复
public void SetData<T>(T obj) where T:IXXX 带有这方法的接口 这样做才有意义。否则没有任何意义。也就是反射, dynamic这种临时性的玩意
Anod 2013-09-18
  • 打赏
  • 举报
回复
引用 4 楼 phommy 的回复:
你这样写就对 虽然我可能会这样写: public void SetData<T>(T obj) { var b = obj as B; if (b != null) { var data = b.GetData(); } }
真对? 我用的时候咋不行呢? 提示我object无法隐式转换为B啊.
phommy 2013-09-18
  • 打赏
  • 举报
回复
你这样写就对 虽然我可能会这样写: public void SetData<T>(T obj) { var b = obj as B; if (b != null) { var data = b.GetData(); } }
Anod 2013-09-18
  • 打赏
  • 举报
回复
引用 1 楼 bdmh 的回复:
看不出你在什么时候转成B,写一个 GetData<T>方法转为需要的类型

public Class A
{
    public void SetData<T>(object obj)
    {
       //传入的obj类型由T来定
       //若obj类型是B
       //求如何调用obj的GetData()方法?
       //强转,as 都不行,难道在B中还要自己实现一个object 到B的转换方法?
       if(typeof(T) == typeof(B))
       {
            string data = ((B)obj).GetData();//目的是这样的,我想拿到这样的数据
       }
     }
}
  
public Class B
{
     public string GetData()
    {
         return "123";
     }
...
}
Anod 2013-09-18
  • 打赏
  • 举报
回复

public Class A
{
    public void SetData<T>(object obj)
    {
       //传入的obj类型由T来定
       //若obj类型是B
       //求如何调用obj的GetData()方法?
       //强转,as 都不行,难道在B中还要自己实现一个object 到B的转换方法?
       if(typeof(T) == typeof(B))
       {
            string data = ((B)obj).GetData();//目的是这样的,我想拿到这样的数据
       }
     }
}
 
public Class B
{
     public string GetData()
    {
         return "123";
     }
...
}
bdmh 2013-09-18
  • 打赏
  • 举报
回复
看不出你在什么时候转成B,写一个 GetData<T>方法转为需要的类型

111,097

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧