C#获取类的属性和值的方法
引言
为什么会引出这样的问题呢?其实,这是必然的,因为我们在日常的代码编写中,当使用到泛型,
如:public class ConvertHelper where T : class,new()
我们会发现此时想要对泛型T进行属性获取和值获取的时候,仿佛成了一个棘手的问题!
一、环境准备
1.1 创建测试类
public class User
{
public string Id { get; set; }
public string UserName { get; set; }
}
1.2 创建List
public List<User> GetList()
{
List<User> list = new List<User>();
string Id = Guid.NewGuid().ToString();
User u1 = new U()
{
Id = Id,
UserName = "UserName1"
};
list.Add(u1);
User u2 = new U()
{
Id = Id,
UserName = "UserName2"
};
list.Add(u2);
User u3 = new U()
{
Id = Id,
UserName = "UserName3"
};
list.Add(u3);
User u4 = new U()
{
Id = Id,
UserName = "UserName4"
};
list.Add(u4);
}
二、获取泛型T的属性
2.1 代码实现
public class ConverHelper<T> where T:class,new()
{
public static void ToDatabale(List<T> tList)
{
T t = new T();
var properties = t.GetType().GetProperties();
foreach (var item in properties)
{
Console.WriteLine(item.Name);
}
}
}
2.2 代码调用
class Program
{
static void Main(string[] args)
{
ConverHelper<User>.ToDatabale(GetList())
}
}
三、获取泛型T的值
3.1 代码实现
public class ConverHelper<T> where T:class,new()
{
public static void ToDatabale(List<T> tList)
{
T t = new T();
var properties = t.GetType().GetProperties();
//获取属性的值
for (int i = 0; i < tList.Count; i++)
{
for (int j = 0; j < properties.Length; j++)
{
var property = properties[j].Name;
var value = tList[i].GetType().GetProperty(property).GetValue(tList[i]);
Console.WriteLine(property + ":" + value);
}
}
}
}
3.2 代码调用
class Program
{
static void Main(string[] args)
{
ConverHelper<User>.ToDatabale(GetList())
}
}
四、扩展:List转DataTable
4.1 代码实现
public class ConverHelper<T> where T:class,new()
{
public static DataTable ToDatabale(List<T> tList)
{
DataTable dt = new DataTable();
T t = new T();
var properties = t.GetType().GetProperties();
//添加列
foreach (var item in properties)
{
dt.Columns.Add(item.Name, item.PropertyType);
}
//获取属性的值
for (int i = 0; i < tList.Count; i++)
{
//添加行
dt.Rows.Add();
for (int j = 0; j < properties.Length; j++)
{
var property = properties[j].Name;
var value = tList[i].GetType().GetProperty(property).GetValue(tList[i]);
//填充行列
dt.Rows[i][property] = value;
}
}
return dt;
}
}
4.2 代码调用
class Program
{
static void Main(string[] args)
{
DataTable dt = ConverHelper<User>.ToDatabale(list);
for (int i = 0; i < dt.Rows.Count; i++)
{
Console.WriteLine("Id:" + dt.Rows[i]["Id"]);
Console.WriteLine("UserName:" + dt.Rows[i]["UserName"]);
}
}
}