问一个有挑战性的问题

lindping 2008-12-12 04:39:55
class a
{
public string name;
}

public getProName(string proValue)
{
.......
}

如何实现 getProName(a.name) == "name" ?

用文字描述的话,就是在某个方法里,当它被调用的时候,假如参数是某个对象的属性,那么在方法里 如何获取该变量在它的类里的成员名称?能实现否?
...全文
403 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
Bodil 2008-12-15
  • 打赏
  • 举报
回复
mark
lindping 2008-12-15
  • 打赏
  • 举报
回复
sorry,我说的是32楼
lindping 2008-12-15
  • 打赏
  • 举报
回复
楼上的,你的确实是一种解决办法,但是似乎代码就累赘一些,而且并不是从实质上解决这个问题。
因为你毕竟还是需要预先定义 public string idFieldName {get {return "id"}}

比如当数据库里的id字段改名为iid的时候,你还是需要手动把这里"id" 改为 "iid"
xycit 2008-12-15
  • 打赏
  • 举报
回复
up
anncesky 2008-12-15
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 ojlovecd 的回复:]
C# code
public class TestClass
{
private string name;
public string Name
{
get { return string.IsNullOrEmpty(name) ? "Name" : name; }
set { name = value; }
}

private string id;

public string Id
{
get { return string.IsNullOrEmpty(id) …
[/Quote]


这样的代码只说明了 name = value 这总对印性才可能得到,否则就
byebye
tylike 2008-12-15
  • 打赏
  • 举报
回复
差点错倒,不过看明白你的意思了:
GetUserList(ExpToString(user.id));
ExpToString(user.id),这里,把user这个类里面多定义几个变量就可以了,如:
public class user
{
public string idFieldName {get;set;} //这里新增进来一个字段的信息
public string id {get;set;}//假设这里是你原来的定义,是为了取得值r
}

GetUserList(user.idFieldName); //这样调用不就实现了你想要的吗?
如果你想传进去任意个参数,将getuserList的定义改成这样就可以了
public GetUserList(params string FieldName)
xjy2004 2008-12-15
  • 打赏
  • 举报
回复
就是说你并不清楚User类有哪些属性,那你怎么会用User.id 呢?你不怕这个id不存在?ExpToString(user.id)=="user.id";?

我觉得还是要自己维护的,辟如一些动态的表单等?或者集合?

权当是说说而已,LZ
我姓区不姓区 2008-12-15
  • 打赏
  • 举报
回复

public class TestClass
{
private string name;
public string Name
{
get { return string.IsNullOrEmpty(name) ? "Name" : name; }
set { name = value; }
}

private string id;

public string Id
{
get { return string.IsNullOrEmpty(id) ? "Id" : id; }
set { id = value; }
}
public string GetProName(string proValue)
{
Type t = this.GetType();
foreach (PropertyInfo pi in t.GetProperties(BindingFlags.Public | BindingFlags.Instance))
{
if (pi.Name == proValue)
return pi.Name;
}
return "";
}
}
static void Main(string[] args)
{
TestClass tc = new TestClass();
Console.WriteLine(tc.GetProName(tc.Name));
Console.WriteLine(tc.GetProName(tc.Id));
}
/*
输出:
Name
Id
*/
ErosSignum 2008-12-15
  • 打赏
  • 举报
回复
属性值反推属性名?
不可能吧
anncesky 2008-12-15
  • 打赏
  • 举报
回复
现在的难题是 无法根据
某个实例的属性的值反推出属性名称。
-------------------
这都想得出来???

除非你的属性值和属性称有一定的对印性,否则别做这千年不遇的战国大梦了
游北亮 2008-12-15
  • 打赏
  • 举报
回复
根据某个实例的属性的值反推出属性名称。
只能哈哈,大笑三声
给你一个“张三”,你能找出这个人是谁吗?

你必须给个对象进去,这个对象包括有关的属性信息
你要想的只是怎么实现更简单,而不是去实现这个虚无飘渺的问题。
anncesky 2008-12-15
  • 打赏
  • 举报
回复
a.name
----------
这个只是一个string type value

没有这个域的相关数据,如果传递MemberInfo mi就完全可以了实现了
lindping 2008-12-15
  • 打赏
  • 举报
回复
楼上的,我觉得实现{"count":"1","str":"测试"}这个一点不难,
把 类的所有成员找出来,遍历一遍,把name和value打印出来就行了,
我现在的问题并非是读取不到属性名字,利用反射能轻易获取到所有属性名称,属性类型,属性值,现在的难题是 无法根据
某个实例的属性的值反推出属性名称。
ErosSignum 2008-12-15
  • 打赏
  • 举报
回复
.net 中是存在楼主所说的从 class.classname中得到classname字符串的
应该和序列化 反序列化,以及智能感知的一些类有关,我以前碰到过,不过不记得了
实在不行,你就反编译Newtonsoft.Json.dll看它怎么实现的吧
ErosSignum 2008-12-15
  • 打赏
  • 举报
回复
这个问题确实够变态的。同意14楼

不过不是不能实现,虽然我不知道实现的原理,但是有实现的例子

不知道你使用过Newtonsoft.Json.dll没。

一个C#的的json序列化与反序列化组件

如果你写一个
public class jt
{
public int count=1;
public string str="测试";
publick jt(){
}
}

然后调用序列化
jt tp=new jt();
JavaScriptConvert.SerializeObject(tp);
就会得到这样一个字符串串
{"count":"1","str":"测试"};

这就是LZ的曙光,反编译下Newtonsoft.Json.dll,看它是怎么获得count以及str的
:)

反射是从字符获得对象哦
游北亮 2008-12-15
  • 打赏
  • 举报
回复
楼主的意思,是不是下面这个意思?
如果表结构变更,对应的实体类的字段也变更的,原来字段叫name,现在改成myName了

那代码里,使用user.name的地方都要跟着变成myName,否则就会编译错误了

楼主是不是希望,实现字段名变更时,使用user.name的地方不用跟着改变呢?
lindping 2008-12-15
  • 打赏
  • 举报
回复
沉了,up一下
lindping 2008-12-14
  • 打赏
  • 举报
回复
楼上的,谢谢你代码,不过好像还是不能解决我的问题啊
满衣兄 2008-12-14
  • 打赏
  • 举报
回复
在给你个winform的例子,这个更容易理解:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Reflection;

namespace WindowsApplication3
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
Type t = typeof(Form1);
MethodInfo[] info = t.GetMethods();
foreach (MethodInfo i in info)
{
MessageBox.Show(i.Name);
}

}

}
}

lindping 2008-12-14
  • 打赏
  • 举报
回复
14 楼说的很对, 在现在c#的语法里,当使用参数a.name的时候,它仅仅是个普通的字符串变量,不包含它所在的对象的信息。
所以,现在似乎不可能实现我的想法。
但有时候确实觉得微软也有很笨的时候,当我敲入 user.name的时候,眼睁睁的看着它,却只能得到它的值,毫无办法得到"user.name"这个字符串。



加载更多回复(17)

62,269

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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