首页 新闻 会员 周边 捐助

泛型方法使用

-1
悬赏园豆:100 [待解决问题]

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;

namespace ConsoleApplication1
{
class Program
{

class User
{
private int age;

public int Age
{
get { return age; }
set { age = value; }
}
private string name;

public string Name
{
get { return name; }
set { name = value; }
}
private string phone;

public string Phone
{
get { return phone; }
set { phone = value; }
}
private string location;

public string Location
{
get { return location; }
set { location = value; }
}
}

class Performance
{
private string name;

public string Name
{
get { return name; }
set { name = value; }
}
private string subject;

public string Subject
{
get { return subject; }
set { subject = value; }
}
private int num;

public int Num
{
get { return num; }
set { num = value; }
}
}

/* 1.调用 queryInformation方法 接收User对象 则queryInformation方法返回字符串
* 如 姓名:张三 年龄:18 电话:15300001111 地址:湖南山沟沟
*
* 2.调用 queryInformation方法 接收Performance对象 则queryInformation方法返回字符串
* 如 姓名:张三 科目:语文 分数:80
*
* 3.queryInformation定义的参数为object,那么在使用过程中必然会需要 装箱、拆箱 的动作
* 装箱、拆箱比较的消耗性能
*
* 目标 queryInformationT方法【泛型方法】接收 User对象或者Performance对象时分别做  出对应的处理 达到调用调用 queryInformation方法 一样的效果

*
*/
static void Main(string[] args)
{
User user = new User();
user.Name = "张三";
user.Age = 18;
user.Phone = "15300001111";
user.Location = "湖南山沟沟";

Performance pel = new Performance();
pel.Name = "张三";
pel.Subject = "语文";
pel.Num = 80;

Program pro = new Program();
string str = "";

str = pro.queryInformation(user);
Console.WriteLine(str);

str = pro.queryInformation(pel);
Console.WriteLine(str);

Console.ReadKey();

str = pro.queryInformationT<User>(user);
Console.WriteLine(str);
Console.ReadKey();

str = pro.queryInformationT<Performance>(pel);
Console.WriteLine(str);
Console.ReadKey();

}

private string queryInformation(object obj)
{
string a = obj.ToString();
string str = "";
if (obj.GetType().Name == "User")
{
User newUser = (User)obj;
str = string.Format(@"姓名:{0} 年龄:{1} 电话:{2} 地址:{3}", newUser.Name, newUser.Age, newUser.Phone, newUser.Location);
}

if (obj.GetType().Name == "Performance")
{
Performance pel = (Performance)obj;
str = string.Format(@"姓名:{0} 科目:{1} 分数:{2}", pel.Name, pel.Subject, pel.Num);
}

return str;
}

private string queryInformationT<T>(T objT)
{
string str = "";

return str;
}
}
}

黎明之始的主页 黎明之始 | 初学一级 | 园豆:102
提问于:2017-12-09 12:52
< >
分享
所有回答(3)
2

问问题直接说你纠结点在哪里,总结一下,而不是一上来就是一段代码,都会懵逼

Jeffcky | 园豆:2789 (老鸟四级) | 2017-12-09 13:08

我想知道 外部调用queryInformationT方法列如:pro.queryInformationT<User>(user);时

queryInformationT<T>(T objT) 方法中 我怎么获取objT 的成员, 

支持(0) 反对(0) 黎明之始 | 园豆:102 (初学一级) | 2017-12-09 14:16
0

把问题表达清楚,问题就解决了一半

dudu | 园豆:29689 (高人七级) | 2017-12-09 14:25

queryInformation(object obj) 定义了object 类型的参数,就意味着obj 可以为 User对象或者Performance对象
在使用过程中因为对象是object 的,所以需要强制转换User newUser = (User)obj; 才能获取User 的成员。

我现在不想用object类型参数,想用泛型的方式T 作为参数,那么我怎么才能获取到 T所代表的对象中的成员 如:姓名

支持(0) 反对(0) 黎明之始 | 园豆:102 (初学一级) | 2017-12-09 14:59

str = pro.queryInformationT<User>(user);

private string queryInformationT<T>(T objT)
{
  string str = "";

  return str;
}

str 怎么得到 "姓名:张三 年龄:18 电话:15300001111 地址:湖南山沟沟" 这个字符串

支持(0) 反对(0) 黎明之始 | 园豆:102 (初学一级) | 2017-12-09 15:01

@黎明之始: 要么强制类型转换,要么用反射,要么传表达式进来

支持(0) 反对(0) dudu | 园豆:29689 (高人七级) | 2017-12-09 15:06

@dudu: T对象不能够强制转换类型,反射的话没有试过

支持(0) 反对(0) 黎明之始 | 园豆:102 (初学一级) | 2017-12-09 15:08

@黎明之始: 先转换为object,然后就可以转换

private string queryInformationT<T>(T objT)
{
    string str = "";
    if (typeof(T) == typeof(User))
    {
        str = ((User)(object)objT).Name;
    }
    return str;
}
支持(0) 反对(0) dudu | 园豆:29689 (高人七级) | 2017-12-09 15:34

@dudu:  转为object类型的 然后在强制转回来,期间装箱、拆箱的性能太差了,我之所以想用泛型就是因为泛型的速度快开销性能够小

支持(0) 反对(0) 黎明之始 | 园豆:102 (初学一级) | 2017-12-09 15:37

@dudu: 我感觉 绕道了死角里面去了

支持(0) 反对(0) 黎明之始 | 园豆:102 (初学一级) | 2017-12-09 15:38

@黎明之始: 本来就不应该在泛型方法中进行强制类型转换

支持(0) 反对(0) dudu | 园豆:29689 (高人七级) | 2017-12-09 15:45
0

type.GetProperties();

如果你想要的是自动弹出来那种,那需要约束T,比如约束为接口或者基类。

花飘水流兮 | 园豆:13617 (专家六级) | 2017-12-09 14:56

private string queryInformationT<T>(T objT) where T : User
{
string str = "";


return str;
}

如果这样约束的话,T就只能是User 的对象,不能获取到 Performance 的成员了

支持(0) 反对(0) 黎明之始 | 园豆:102 (初学一级) | 2017-12-09 15:04

@黎明之始: 

public static string GetPropertyName<T>(Expression<Func<T, object>> expr)
{
var rtn = string.Empty;
if (expr.Body is UnaryExpression)
{
rtn = ((MemberExpression)((UnaryExpression)expr.Body).Operand).Member.Name;
}
else if (expr.Body is MemberExpression)
{
rtn = ((MemberExpression)expr.Body).Member.Name;
}
else if (expr.Body is ParameterExpression)
{
rtn = ((ParameterExpression)expr.Body).Type.Name;
}
return rtn;
}

支持(0) 反对(0) 花飘水流兮 | 园豆:13617 (专家六级) | 2017-12-09 17:08

用法:GetPropertyName<T>(t=>t.XX);

支持(0) 反对(0) 花飘水流兮 | 园豆:13617 (专家六级) | 2017-12-09 17:13
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册