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;
}
}
}
问问题直接说你纠结点在哪里,总结一下,而不是一上来就是一段代码,都会懵逼
我想知道 外部调用queryInformationT方法列如:pro.queryInformationT<User>(user);时
queryInformationT<T>(T objT) 方法中 我怎么获取objT 的成员,
把问题表达清楚,问题就解决了一半
queryInformation(object obj) 定义了object 类型的参数,就意味着obj 可以为 User对象或者Performance对象
在使用过程中因为对象是object 的,所以需要强制转换User newUser = (User)obj; 才能获取User 的成员。
我现在不想用object类型参数,想用泛型的方式T 作为参数,那么我怎么才能获取到 T所代表的对象中的成员 如:姓名
str = pro.queryInformationT<User>(user);
private string queryInformationT<T>(T objT)
{
string str = "";
return str;
}
str 怎么得到 "姓名:张三 年龄:18 电话:15300001111 地址:湖南山沟沟" 这个字符串
@黎明之始: 要么强制类型转换,要么用反射,要么传表达式进来
@dudu: T对象不能够强制转换类型,反射的话没有试过
@黎明之始: 先转换为object,然后就可以转换
private string queryInformationT<T>(T objT)
{
string str = "";
if (typeof(T) == typeof(User))
{
str = ((User)(object)objT).Name;
}
return str;
}
@dudu: 转为object类型的 然后在强制转回来,期间装箱、拆箱的性能太差了,我之所以想用泛型就是因为泛型的速度快开销性能够小
@dudu: 我感觉 绕道了死角里面去了
@黎明之始: 本来就不应该在泛型方法中进行强制类型转换
type.GetProperties();
如果你想要的是自动弹出来那种,那需要约束T,比如约束为接口或者基类。
private string queryInformationT<T>(T objT) where T : User
{
string str = "";
return str;
}
如果这样约束的话,T就只能是User 的对象,不能获取到 Performance 的成员了
@黎明之始:
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;
}
用法:GetPropertyName<T>(t=>t.XX);