C# 关于反射和属性的一个比较难的问题

mfc198666_002 2012-05-17 10:48:02
using System;
using System.Reflection;

public class ColumNameAttribute : Attribute
{
public ColumNameAttribute(string name)
{
this.ColumName = name;
}
public string ColumName { get; set; }
}



public class Student
{
[ColumName("Student.Name")]
public string Name { get; set; }
[ColumName("Student.Age")]
public int Age { get; set; }
}

public class Test
{
public static void Main()
{
Student st = new Student();
string name = (有什么方法,可以通过 "st.Name"这个变量来获得它的自定义属性"Student.Name"????)

Console.WriteLine(name);
Console.Read();
}
}
...全文
253 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
assky124 2012-05-25
  • 打赏
  • 举报
回复
上面的代码把所有自定义特性对应的属性都列举出来了。

重构下函数,传个参数进去,然后在循环中加个判断条件不就完了!
mfc198666_002 2012-05-17
  • 打赏
  • 举报
回复
我当然知道属性取得的值就是字段的值,所以我才问有没有好的办法

我试过判断字段的内存地址 ,但是只有string 的匹对出来,int的就不行了
mfc198666_002 2012-05-17
  • 打赏
  • 举报
回复
楼上你的代码编译不过去啊,

PropertyInfo info;//循环取得的属性 你是要如何循环啊
assky124 2012-05-17
  • 打赏
  • 举报
回复

PropertyInfo info;//循环取得的属性
object[] objs = info.GetCustomAttributes(typeof(ColumNameAttribute), false);
cheng2005 2012-05-17
  • 打赏
  • 举报
回复
st.Name
这个东西取的是Name里面的值,你想通过值来找属性的信息,那是不可能的,就好像箱子里放着苹果,你想通过苹果来取得箱子的信息,那根本就不可能。

你只能通过类来找属性,就好像是你只能通过架子来找箱子,但是不能通过箱子里的苹果来找箱子。
mfc198666_002 2012-05-17
  • 打赏
  • 举报
回复
你的意思是?

t.GetProperty("Name")
t.GetProperty("Age")

吗?

我不想用字符串来读这个属性 我想用 st.Name 变量点出来的这个属性是否可以返回它的自定义属性?
cheng2005 2012-05-17
  • 打赏
  • 举报
回复
Type t = st.GetType();
至于之后取属性,然后取特性我相信你已经会了,不会的话那你就是根本不会用反射
mfc198666_001 2012-05-17
  • 打赏
  • 举报
回复
谢谢楼上的代码,辛苦你了。

string name = (有什么方法,可以通过 "st.Name"这个变量来获得它的自定义属性"Student.Name"????)

就是要用到st.Name 这个属性

比如

private string GetName(object obj)
{
.....
retrun 自定义属性ColumName ;
}

调用的时候 string ColumName = GetName(st.Name);

就是指定了变量属性返回 对应的自定义属性ColumName

请问您上面的代码 我如何把st.Name 给他?

不过还是谢谢了
assky124 2012-05-17
  • 打赏
  • 举报
回复
你不就是要用自定义特性,检索出,对应的特性么



class Program
{
static void Main(string[] args)
{
Student st = new Student();
Type t = st.GetType();
foreach (var item in t.GetProperties())
{
object[] objs = item.GetCustomAttributes(typeof(ColumNameAttribute), false);
if (objs.Length > 0)
{
Console.WriteLine(string.Format("{0} cusName:{1}", item.Name, (objs[0] as ColumNameAttribute).ColumName));
}
}
Console.ReadKey();
}
}




输出:
Name cusName:Student.Name
Age cusName:Student.Age


要不就是我语文太差,理解错了?
mfc198666_001 2012-05-17
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
引用 6 楼 的回复:
我当然知道属性取得的值就是字段的值,所以我才问有没有好的办法

我试过判断字段的内存地址 ,但是只有string 的匹对出来,int的就不行了

你还是没理解。
通过值去找属性就如同通过苹果去找箱子,需要注意的是,一个苹果可能会属于不同的箱子。
所以这是一个不可逆的过程。
[/Quote]

new 出一个对象和为里面的字段赋值 会需要占用内存空间和内存地址。

我用st.Name 这个属性的内存地址 和 反射出来的 GetValue(st, null)的内存地址 做比较

奇怪的是我可以匹对出所有的 string 型很准确的找出来, 但是 INT 型的就找不到

所以我才想问一下, 有什么好的办法, 你说的这个其实我 刚开始我是这么想的 我也觉得不可能
mfc198666_002 2012-05-17
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
Type.GetProperties()!

都知道了GetProperty了,旁边的函数不会看看啊!
[/Quote]

你更搞笑,你自己试了吗?

PropertyInfo info;//循环取得的属性
object[] objs = info.GetCustomAttributes(typeof(ColumNameAttribute), false);

循环取得的属性? 你怎么知道我要的是哪个属性? 我要问的就是如何找到对应的属性。

还不如楼上说的,考点谱
mfc198666_002 2012-05-17
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
引用楼主 的回复:
using System;
using System.Reflection;

public class ColumNameAttribute : Attribute
{
public ColumNameAttribute(string name)
{
this.ColumName = name;
}
public string ColumName { ge……
[/Quote]

这个跟你调用不调用LINQ没有关系,我就是不想出现"NAME", 如果我在突然改了属性名称用"Name"根本不好找
你的选择H 2012-05-17
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
using System;
using System.Reflection;

public class ColumNameAttribute : Attribute
{
public ColumNameAttribute(string name)
{
this.ColumName = name;
}
public string ColumName { get; ……
[/Quote]
Student st = new Student { id = 1, name = "shen" };
System.Reflection.PropertyInfo[] pro = typeof(Student).GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);

string value = pro.First(c => c.Name == "Name").GetValue(st, null).ToString();
cheng2005 2012-05-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
我当然知道属性取得的值就是字段的值,所以我才问有没有好的办法

我试过判断字段的内存地址 ,但是只有string 的匹对出来,int的就不行了
[/Quote]
你还是没理解。
通过值去找属性就如同通过苹果去找箱子,需要注意的是,一个苹果可能会属于不同的箱子。
所以这是一个不可逆的过程。



assky124 2012-05-17
  • 打赏
  • 举报
回复
Type.GetProperties()!

都知道了GetProperty了,旁边的函数不会看看啊!

111,126

社区成员

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

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

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